6

JavaのGUIは初めてです。

たとえば、1 つの要素 (例: JLabel) だけを更新する必要があります。Tkinter では、root.update()orのようなものを使用しますroot.update_idletasks()。スイングで作ったアプリにも似たような簡単な機能があるのか​​な。gui_element.SetVisible(false)などを試してみましgui_element.SetVisible(true)たが、うまくいきませんでした。何かjavax.swing.Timerがうまくいくはずですが、方法がわかりません。

編集ここにコードがあります。他のエラーを見つけた場合はお知らせください。ありがとう

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class sof_sample{

    /**
     * @param args
     */

    private static JFrame frame1 = new JFrame("Fractal Geometry");
    public static JButton quit_button = new JButton("Quit");
    private static JButton run_button = new JButton("Run");
    private static JLabel label1 = new JLabel();
    public static JLabel label_iter = new JLabel(); 
    private static GridLayout layout1 = new GridLayout(2,20);
    private JOptionPane msg1 = new JOptionPane();
    private static int counter;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        AuxClass1 inst1 = new AuxClass1();
        quit_button.addActionListener(inst1);
        run_button.addActionListener(inst1);
        label1.setText("Iteration");
        label1.setVerticalTextPosition(JLabel.CENTER);
        label1.setHorizontalAlignment(JLabel.CENTER);
        label_iter.setText("0");
        label_iter.setBorder(BorderFactory.createLineBorder(Color.BLACK));      
        label_iter.setVerticalTextPosition(JLabel.CENTER);
        label_iter.setHorizontalAlignment(JLabel.CENTER);

        //add widgets to the frame
        frame1.add(label1);
        frame1.add(label_iter);
        frame1.add(run_button);
        frame1.add(quit_button);

        frame1.setLayout(layout1);
        frame1.setLocationRelativeTo(null);
        //frame1.pack();
        frame1.setSize(250, 75);
        frame1.setVisible(true);

    }

}

class AuxClass1 implements ActionListener{
    sof_sample inst2 = new sof_sample();

    public void actionPerformed(ActionEvent event1){

        if (event1.getSource()==inst2.quit_button){
            System.exit(0);

        }
        else{
            for (int i=0;i<20000;i++){

                inst2.label_iter.setText(Integer.toString(i));

            }
            //msg1.showMessageDialog(frame1, "Not yet!");

        }


    }



}
4

2 に答える 2

7

Swingはイベント駆動型です。すべてのコンポーネントはMVCパターンを介して機能します。画面上の表現を更新するために、非表示/表示して明示的に再描画する必要はありません。

これを行うだけyourLabel.setText("your new text")で、新しいテキストがラベルに表示されます。

ほとんどのGUI更新(setText例外です)はEDTで実行する必要があることに注意してください。したがって、SwingUtilities.invokeLater更新がネットワークメッセージなどによってトリガーされる場合は、etcを使用してください。

GUIに構造的な変更を加える場合は、revalidate()/する必要がrepaint()あります。

于 2012-08-21T05:23:36.303 に答える
0

Javax.swing.Timer を使用することで、目標を達成できます。

    timer = new Timer(100,new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            label.setText(String.valueOf(i));
            if(i==100){
                timer.stop();
            }
            i++;
        }
    });

JLabel の値を変更したい場合は、その時点で を使用してタイマーを開始するだけtimer.start()で、ラベルのi値が 100 になるまで変更されます。値が 100 に達するtimer.stop()と、タイマーが停止します。

ここに javax.swing.timer チュートリアルがあります。これを見てください。 http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/Timer.html

以下のリンクから実際の例をダウンロードしてください...

https://docs.google.com/open?id=0B9U-BwYu62ZaQWZMWloxdHp0YWs

私はそれがあなたのために働くと思います..

于 2012-08-21T13:53:59.267 に答える