5

メソッドを使用して JLabel を更新しようとしていますが、JLabel をsetText()再描画できません。そのためにメソッドを使用するrepaint()必要がありますか?

これがコードの一部です。エラーは発生しませんが、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());
    }
}
4

6 に答える 6

14

JLabel は、再描画の呼び出しを必要としません。setText(...) を呼び出すだけで、ラベルのテキストが変更されます。必要なのはそれだけです。

あなたの問題は並行性の問題なのか、Swing イベント スレッドで実行時間の長いプロセスを実行しているのか、これがラベルのテキストの更新を妨げているのでしょうか。

その場合は、SwingWorker によって提供されるようなバックグラウンド スレッドで長時間実行されるプロセスを実行し、SwingWorker のパブリッシュ/プロセス メソッドを介して実行できるように、Swing スレッドで JLabel のテキストを更新することを検討してください。

詳細については、Lesson: Concurrency in Swingチュートリアルをご覧ください。

また、Mario De... は、JLabel に単純な改行を印刷できないことについて正しいです。彼の答えに1+。

于 2012-04-12T22:51:59.637 に答える
5

フレーム/コンポーネントの再描画がJavaでどのように機能するかについて、私は少し困惑しています。できます。javadoc によれば、単に を呼び出しPaint(Graphics g)ます。最後に...update(Graphics g)paint(g)repaint()

これらのいずれも機能しない場合は、現在テキストを設定しようとしている行にのみラベルを作成する方が簡単ではないでしょうか?

編集: 編集不可の textArea を使用するオプションもあります。標準の改行文字を表示できるだけでなく、jScrollPane に配置することもできます。これは、ログに多数のファイルがある場合に便利で、更新されたテキストを表示するためにテキスト コンポーネントを再描画する必要がありません。ボーナスがすごい…

于 2012-04-12T22:47:53.403 に答える
4

この簡単な例は私にとってはうまくいくので、問題は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();

}
}
于 2012-04-12T22:53:40.103 に答える