Question about displaying text in LibGDX using a console - java

I had a quick question. I am writing a text based game using Java and LibGDX. I want to create something like a console. I would like to store all previous messages while being able to add new ones. However, I don't need users to input any data into the console. I saw that labels might work, but I am unsure of how to keep the existing text while adding new text to a label. I am fairly new to using LibGDX and thought someone could think of a better way to do this.
Thanks

Just a quick suggestion for where to start, since I haven't done this myself:
Label is the typical way to draw text, but it re-computes the glyphs for all the text every time you change the text. Under the hood, it uses BitmapFontCache for the rendering. BitmapFontCache lets you append text using addText() without recomputing what it has already done.
So what I would do is use BitmapFontCache directly for your text rendering, and append text to it. Maybe calculate how many lines of text it takes to fill the screen or half the screen, and create a new instance each time you reach that threshold. That way, you can selectively render only the ones that overlap the camera viewport so you aren't drawing hundreds of off-screen glyphs.

In a simpliest way you can just recreate your label every time. Do something like this.
String text = "text";
Lable createLabel(String addText) {
text = text + addText
return Label(text, skin)
}
Then just call this function where you need a label

Related

Dynamical Font-size in TextArea - JavaFX

I am currently trying to get into JavaFx and started writing a program similar to Microsoft Word or Pages on OS X. I had to realize that the TextArea is really limited when it comes to style, so I was wondering if there is a component that is editable (as in you can write on it) and is able to change font size/color dynamically (size and color are defined with a choicebox on the UI.
I read a little but about binding style-types or setting css rules, but as far as I know there is no way to access Java components (choicebox) or even variables from the css style sheet, so it wouldn't be dynamical.
What I mean by dynamically change font size/color:
Type a character into the TextArea.
Double the font size.
Type another character, that now appears twice as big as the first one, that is still displayed in its original size.
I'm having a hard time explaining myself, if you have any questions, please ask and I'll try going into further detail. Thanks
EDIT: Something that might be important is the fact that I am using Scene builder to create my UI.
EDIT 2: Could I cheat my way around it using a Highlighter with the same color as my background?

Swing: non input text field

I'm new in Swing, and don't want to learn it. I just want to write a simple frame divided into two equal parts: top and bottom. The top part of frame should be a simple immutable text field.
Problem: As I understand, to show text with beautiful font I should use JTextPane. But JTextPane:
Doesn't support vertical text alignment; (I haven't got any desire to write something like that)
I don't know how to switch off editing.
Quedtion I believe there is a simpler solution for my purpose. Is there?
The top part of frame should be a simple immutable text field.
Use a JLabel. It supports HTML which might help with your formatting.
I don't know how to switch off editing.
setEditable( false );

How can I present multiline data in grid like component in Java and AWT

I have a few records of data (less then 10). Each record consists of a few lines of text.
I want to present records to the user in a kind of grid, where user can select one of the records.
I was thinking about List component or jTable, but I couldn't make them displaying more then one line of text. What component should I use then, or how to approach this?
In subject I suggested AWT because size does matter, i.e. I want use this functionality in the applet and would like to avoid any extra libraries.
Thanks in advance
Thanks to maksimov's link I found examples of how to tackle this issue, and also very interesting link I missed somehow - http://docs.oracle.com/javase/tutorial/uiswing/components/html.html
To specify that a component's text has HTML formatting, just put the
tag at the beginning of the text, then use any valid HTML in
the remainder. Here is an example of using HTML in a button's text:
button = new JButton("<html><b><u>T</u>wo</b><br>lines</html>");
In my case it was just enough to set height of the row and add tag just before string data to be displayed. HTML tagging also let me use extra formatting, colors, etc,
Brilliant,
Thank you maksimiov

Scroll through JLabel held in JScrollPane

I have a JScrollPane that holds a JLabel using the following code:
//Create TEXT LOG JPanel
textLogPane = new JScrollPane(logLabel);
textLogPane.setPreferredSize(textLogPaneDim);
//textLogPane.setOpaque(true);
textLogPane.setBorder(BorderFactory.createLineBorder(Color.BLACK));
textLogPane.getViewport().setBackground(Color.DARK_GRAY);
The JLabel, logLabel, is represented by a string with an HTML encoding using for carriage returns. I display certain images based on the contents of certain lines and I would like to be able to scroll the JScrollPane, textLogPane, to show that line whenever I am displaying that graphic. I know the contents of the line that I want to display but I can't seem to figure out how to get it to scroll down(or up) to the relevant line.
If need be I can change to something other than a JLabel as long as I can keep the HTML encoding and have it look just like multiple lines of text.
Sorry if this is a repeat I tried searching but couldn't find any results.
Thanks
You can do some custom maths and use scrollRectToVisible() in your viewport. I don't know how to compute the rect of a specific line in your JLabel. A better solution would be to stick your strings into a JList instead, perhaps with a custom renderer for the html, and use
list.ensureIndexIsVisible(list.getSelectedIndex());
You don't use "carriage returns" in HTML, you use "br" tags.
I would suggest you should probably be using a JTextPane for multiline text. I also find it easier to not use HTML, but instead to add strings with attributes. You can also insert icons into a JTextPane.
Read the section from the Swing tutorial on Using Text Components for a working example.

Restrict number of lines in html JLabel

I have a JLabel that needs to display some html-formatted text. However, I want to restrict this to being 4 lines long (and if so, provide a button to see everything).
So far, I've tried setting the maximum size manually or via a layout manager. However, both of these solutions can cause part of a line to be displayed.
edit: To add a little more details, I need to force 4 lines even when respecting line wrapping correctly, resizing components, and changing font sizes. I've considered handling resize/fontsize changes by replacing the label with a new one that fits correctly.
JLabel seems to handle incomplete tags well, so I could probably do something like a binary search on the input string finding which character would cause it to go over the 4 line limit (using FontMetric to determine how many pixels 4 lines would be), and then replacing an existing label with the new one. The big downside to this approach is that I need to run the computation every time the user resizes the panel or changes fonts (and it feels like a dirty dirty hack).
Add the JLabel to a JScrollPane as set the scrollpane with a reasonable preferred size. Scrollbars will appear a necessary.
I don't know of any absolute solution to the questions since I doubt you can define what a "line" is. One line of text may be font 12 and another 24. I don't know of any way to calculate the height of each given line.
Even if you did use a ComponentListener to handle the componentResized() event I'm not sure you can come up with a reasonable algorithm to to calculate the exact width/height of of a 4 line display.
I would try running through the String of text and removing all text after the third "\n"
String shortenText(String oldtext){
String newText = "";
for(int i=0;i<3;i++){
newText += oldtext.substring(0,oldtext.indexOf("\n"));//adds one line to String
oldtext = oldtext.substring(indexOf("\n")+1);//shorten old string to prepare for next iteration
}
return newText;
}
You may also want to try the same algorithm, except strip of <p> and <br> tags as well...
If you know the values of the possible tags just switch the text from "\n" to "<br>" or any tag you need
Hey, I found a way that works. The framework I'm working with allows me to create a listener for font size changes. In this listener, I determine what the new max size of the label is (getFontMetrics(font).getHeight() * 4) and then re-set the maximum height on the label to this and then relayout everything. This even handles the word wrap case well. I'm guessing that someone could do nasty things with silly HTML input, but this covers the 99% case pretty well.

Categories

Resources