2012-04-12 2 views
2

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

Вот часть кода. Я не получаю никаких ошибок, но это не обновление 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()); 
    } 
} 
+2

Я бы сказал, что jLabel не может отображать символ новой строки. Оберните его в и используйте теги
. – MarioDS

+0

Вы уверены, что не переустанавливаете переменную 'log' в новый экземпляр' JLabel' * после того, как вы добавили его в свой менеджер компоновки? – Danish

+0

Да, на самом деле я проиндексировал его с помощью конструктора. – Isuru

ответ

2

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

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

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

+0

Вы правы на отметке о JLabel, не позволяя простым новым строкам и вместо этого использовать JTextArea. 1+. –

9

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

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

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

Подробнее об этом, пожалуйста, ознакомьтесь с учебником Lesson: Concurrency in Swing.

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

2

Этот простой пример работает для меня, поэтому проблема заключается не в 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(); 

} 
} 
2

У меня возникла аналогичная проблема. Я попробовал setText («Good Bye») в actionPerformed() в выходной кнопке ActionListener, прежде чем удалять JFrame прямо там. Но текст не менялся. В конце концов я понял, что мой ярлык не обновляется, поскольку я удалял фрейм в анонимном классе ActionListener. После того, как я позволил оставить код ActionListener.actionPerformed(), текст ярлыка обновился. Я должен был использовать JFrame в новом потоке, хотя для обеспечения того, чтобы 1. actionPerformed завершен, чтобы основной поток возвращался из анонимного вложенного класса и обновлял метку в основном классе. 2. Запускается новый поток, который ждет секунды, чтобы можно было прочитать «Good Bye». 3. Эта новая нить располагает рамкой.

Смежные вопросы