0

以下のプログラムは、基本的に JFrame の frame.repaint() を呼び出して、フレーム内を動的に塗りつぶします。同じ行で、フレームの 2 つのラベル (西と東) を持ち、ラベルを動的に変更したいと思います。Jlabel label.repaint()、label.removeAll()など、たくさん試しましたが、うまくいきません。記入できるように、コードをきれいに残しました...

JFrame frame=new JFrame();
frame.setSize(512, 512);
frame.add(image1);
frame.setVisible(true); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


start_sum=0;

while(true)
{
    frame.repaint();
    try {
        Thread.sleep(sleep_for_each_rotation);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    start_sum+=radian/divide_size;             //Some calculation stuff
    if(start_sum>=360)
        start_sum=0;

}
4

2 に答える 2

2

コードの外観から、イベント ディスパッチ スレッド (EDT) をブロックしています。

EDT は (特に) 再描画イベントの処理を担当します。これは、EDT をブロックすると、何も再描画できないことを意味します。

もう 1 つの問題は、EDT 以外のスレッドから UI コンポーネントを作成または変更してはならないということです。

詳細については、Swing での同時実行をご覧ください。

次の例では単純に を使用していますが、音からすると、おそらくSwing Workerの方が便利であるjavax.swing.Timerことがわかります。

public class TestLabelAnimation {

    public static void main(String[] args) {
        new TestLabelAnimation();
    }

    public TestLabelAnimation() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JLabel left;
        private JLabel right;

        public TestPane() {
            setLayout(new BorderLayout());

            left = new JLabel("0");
            right = new JLabel("0");

            add(left, BorderLayout.WEST);
            add(right, BorderLayout.EAST);

            Timer timer = new Timer(250, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    left.setText(Integer.toString((int)Math.round(Math.random() * 100)));
                    right.setText(Integer.toString((int)Math.round(Math.random() * 100)));
                }
            });

            timer.setRepeats(true);
            timer.setCoalesce(true);
            timer.start();

        }

    }

}
于 2013-02-13T10:29:46.597 に答える
-1

JLabel.setText (String)次の例のようにメソッドを使用するだけです。

public static void main (String[] args) throws Exception {
    final JLabel label = new JLabel (String.valueOf (System.currentTimeMillis()));

    JFrame frame = new JFrame ();
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout (new BorderLayout ());
    frame.getContentPane().add (label, BorderLayout.CENTER);
    frame.pack ();
    frame.setVisible(true);

    while (true)
    {
        final String newText = String.valueOf (System.currentTimeMillis ());

        SwingUtilities.invokeLater (new Runnable ()
        {
            @Override
            public void run() {
                label.setText (newText);
            }
        });

        Thread.sleep (100L);
    }
}
于 2013-02-13T10:19:08.857 に答える