JLabel setText не обновляет текст

Я пытаюсь обновить JLabel с помощьюsetText() метод, но я не могу перерисовать JLabel. Должен ли я использоватьrepaint() способ сделать это?

Вот часть кода, я не получаю никаких ошибок, но это не обновление JLabel.

<code>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());
    }
}
</code>
 Isuru13 апр. 2012 г., 00:50
да, на самом деле я инициализировал его с помощью конструктора.
 Danish13 апр. 2012 г., 00:45
Вы уверены, что не реинициализируетеlog переменная к новомуJLabel примерafter Вы добавили его в свой менеджер макета?
 Hovercraft Full Of Eels13 апр. 2012 г., 00:50
JLabel не требует перерисовки. Просто звонюsetText(...) изменит текст метки, и это все, что требуется.
 MarioDS13 апр. 2012 г., 00:40
Я бы начал с того, что jLabel не может отображать символ новой строки. Оберните это в & lt; html & gt; и используйте & lt; br / & gt; теги.

Ответы на вопрос(5)

Я немного озадачен тем, как перекрашивание фреймов / компонентов работает в Java. Вы можетеPaint(Graphics g), update(Graphics g) который в соответствии с Javadoc просто называетpaint(g), Наконец, такжеrepaint()...

Если ни один из них, похоже, не работает, не будет ли проще создать ярлык только в той строке, где вы сейчас пытаетесь задать текст?

Редактировать: есть также возможность использования неизменяемой текстовой области. Он может не только отображать стандартный символ новой строки, но и помещать его в jScrollPane, что удобно, когда в журнале много файлов и вам не нужно перерисовывать текстовые компоненты для отображения обновленного текста. Бонус великолепен ...

 13 апр. 2012 г., 00:57
Вы правы в том, что JLabel не разрешает простые новые строки и вместо этого использует JTextArea. 1+.

repaint() не будет работать здесь.

Просто использоватьlabel_name.paintImmediately(label_name.getVisibleRect());

Это будет обновлено прямо сейчас.

JLabel не требует перерисовки. Простой вызов setText (...) изменит текст метки, и это все, что требуется.

Интересно, если ваша проблема связана с параллелизмом, что вы выполняете длительный процесс в потоке событий Swing и что это не позволяет вашей метке обновить свой текст.

Если это так, то подумайте о том, чтобы выполнить длительный процесс в фоновом потоке, например, предоставляемом SwingWorker, а затем обновить текст JLabel в потоке Swing, как это можно сделать с помощью методов публикации / процесса SwingWorker. ,

Подробнее об этом, пожалуйста, посмотрите наУрок: параллелизм в Swing руководство.

Также Марио Де ... прав в том, что не может печатать простые строки на JLabel. 1+ к его ответу.

Я столкнулся с подобной проблемой. Я пыталсяsetText("Good Bye") вactionPerformed() в кнопке выхода ActionListener перед тем как избавиться от моего JFrame прямо там, но текст не изменился.

В конце концов я понял, что мой ярлык не обновлялся, поскольку я размещал фрейм в анонимном классе ActionListener. После того, как я позволил коду уйтиActionListener.actionPerformed(), текст метки обновился.

Я должен был разместить свой JFrame в новом потоке, чтобы убедиться, что:

actionPerformed is finished so that the main thread returns from the anonymous nested class and updates the label in the main class.

A new thread is started which waits for a second to allow "Good Bye" to be read.

This new thread the disposes the frame.

Этот простой пример работает для меня, поэтому проблема неJLabel но какая-то ошибка в другой части вашего исходного кода. Пожалуйста, опубликуйте полный исходный код.

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Application {

public static void main(String[] args) {
    JFrame frame = new JFrame("JLabel test");
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    Panel p = new Panel();
    p.setLayout(new GridLayout());

    Button button = new Button("Change");
    final JLabel label = new JLabel(Long.toString(Long.MAX_VALUE));

    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            label.setText(Long.toString(e.getWhen()));
        }
    });

    p.add(button);
    p.add(label);
    frame.add(p, BorderLayout.NORTH);
    frame.pack();

}
}

Ваш ответ на вопрос