2012-04-12 156 views
2

我想通過使用setText()方法更新JLabel。但我無法重繪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 2012-04-12 22:40:37

+0

您確定在將* log添加到佈局管理器之後,您沒有將'log'變量重新初始化爲新的'JLabel'實例? – Danish 2012-04-12 22:45:10

+0

是的,實際上我用構造函數初始化它。 – Isuru 2012-04-12 22:50:12

回答

2

我有點難以理解在Java中如何重新繪製框架/組件。你可以Paint(Graphics g)update(Graphics g)哪個根據javadoc只叫paint(g)。最後還有repaint() ...

如果這些看起來都不起作用,那麼僅僅在您正在嘗試設置文本的行上創建標籤不會更容易嗎?

編輯:也可以選擇使用不可配置的textArea。它不僅可以顯示標準換行符,而且可以將它放在jScrollPane中,當日志中有很多文件時它很方便,並且不需要重新繪製文本組件以顯示更新的文本。獎金是宏偉的imo ...

+0

你對JLabel不允許簡單的新行和使用JTextArea的看法是正確的。 1+。 – 2012-04-12 22:57:19

9

JLabel不需要重新打電話。只需調用setText(...)將更改標籤的文本,這就是所需的全部內容。

我不知道你的問題是否是一個併發問題,你在Swing事件線程上做了一個長期運行的過程,並且這阻止了你的標籤更新它的文本。

如果是這樣,那麼請考慮在後臺線程(如SwingWorker提供的後臺線程)中執行長時間運行的進程,然後更新Swing線程上的JLabel文本,例如可以通過SwingWorker的publish/process方法。

欲瞭解更多信息,請查看Lesson: Concurrency in Swing教程。

另外Mario De ...對於無法在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

我遇到了類似的問題。我嘗試在退出按鈕ActionListener中的actionPerformed()中設置TextText(「Good Bye」),然後將我的JFrame放置在那裏。但文字並沒有改變。最終我意識到我的標籤沒有被更新,因爲我將該框架置於匿名ActionListener類中。在讓代碼離開ActionListener.actionPerformed()後,標籤文本得到更新。我不得不在一個新線程中部署我的JFrame,但要確保 1. actionPerformed已完成,以便主線程從匿名嵌套類返回並更新主類中的標籤。 2.啓動一個新的線程,等待一秒鐘以允許讀取「Good Bye」。 3.這個新線程配置幀。