Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JLabel setText not updating text

I am trying to update a JLabel by using the setText() method, but I can't redraw JLabel. Do I have to use the repaint() method to do that?

Here is the part of code, I do not get any errors, but it is not updating the JLabel.

public void actionPerformed(ActionEvent e) {
    fc = new JFileChooser();
    if(e.getSource() == addButton) {
         int returnVal = fc.showOpenDialog(Main.this);
         if (returnVal == JFileChooser.APPROVE_OPTION) {
                filesList = fc.getSelectedFiles();
                setFilesList(filesList);

                StringBuilder logString = new StringBuilder();
                logString.append("Files to Convert " + "\n");
                for(int i = 0; i < getFiles().length; i++) {
                    logString.append(filesList[i].getAbsolutePath());
                }
                //JLabel log = new JLabel(); created above.
                log.setText(logString.toString());
            } else {
                //log.append("Open command cancelled by user." + newline);
        }
        //log.setCaretPosition(log.getDocument().getLength());
    }
}
like image 989
Isuru Avatar asked Apr 12 '12 22:04

Isuru


People also ask

How do I change the text of a JLabel?

JLabel requires no repaint call. Simply calling setText (...) will change the label's text, and that is all that is required. I wonder if your problem is a concurrency issue, that you are doing a long-running process on the Swing event thread and that this is preventing your label from updating its text.

How can I update JLabel text in a long-running process?

If so, then consider doing your long-running process in a background thread such as that provided by a SwingWorker, and then updating your JLabel's text on the Swing thread, such as can be done via the SwingWorker's publish/process methods. For more on this, please have a look at the Lesson: Concurrency in Swing tutorial.

How do I change the text of a label in swing?

Simply calling setText (...) will change the label's text, and that is all that is required. I wonder if your problem is a concurrency issue, that you are doing a long-running process on the Swing event thread and that this is preventing your label from updating its text.


2 Answers

JLabel requires no repaint call. Simply calling setText(...) will change the label's text, and that is all that is required.

I wonder if your problem is a concurrency issue, that you are doing a long-running process on the Swing event thread and that this is preventing your label from updating its text.

If so, then consider doing your long-running process in a background thread such as that provided by a SwingWorker, and then updating your JLabel's text on the Swing thread, such as can be done via the SwingWorker's publish/process methods.

For more on this, please have a look at the Lesson: Concurrency in Swing tutorial.

Also Mario De... is correct about not being able to print simple new-lines on a JLabel. 1+ to his answer.

like image 79
Hovercraft Full Of Eels Avatar answered Oct 13 '22 20:10

Hovercraft Full Of Eels


I'm a bit stumped on how the repainting of frames/component works in Java. You can Paint(Graphics g), update(Graphics g) which according to the javadoc just calls paint(g). Finally there's also repaint()...

If none of those seem to work, wouldn't it just be easier to create the label only at the line where you are currently trying to set the text?

Edit: there is also the option of using an ineditable textArea. Not only can it display the standard newline character, but you can put it in a jScrollPane, which is handy when you have lots of files in the log, and you don't need to repaint text components to display updated text. The bonus is magnificent imo...

like image 38
MarioDS Avatar answered Oct 13 '22 22:10

MarioDS