0

tester2 フレームの [ok] ボタンをクリックすると、tester1 フレームが表示され、showbumber ボタンをクリックすると、ラベルに乱数が表示されるフレームがあります。

しかし、スリープメソッドを使用している間、この生成された数値を見ることができません!

助けてくれてありがとう。

public class tester2 extends JFrame implements ActionListener {

public tester2() {
    setTitle("Hello");
    setLayout(new FlowLayout());
    JButton okButton = new JButton("Ok");
    okButton.addActionListener(this);
    add(okButton);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setBounds(40, 50, 300, 400);

}

@Override
public void actionPerformed(ActionEvent e) {
    tester1 tester1 = new tester1(tester2.this);
    tester1.setVisible(true);
}

public static void main(String[] args) {
    new tester2().setVisible(true);
}
}

テスター 1:

public class tester1 extends JDialog implements ActionListener {

JLabel lbl1;
JButton showButton;

public tester1(JFrame owner) {
    super(owner, "tester1", true);
    showButton = new JButton("Show Number");
    showButton.addActionListener(this);
    lbl1 = new JLabel("     ");

    this.add(showButton);
    this.add(lbl1);
    this.setBounds(40, 50, 300, 400);
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == showButton) {
        GenerateNumber();
        tester1.this.dispose();
    }
}

public void GenerateNumber() {
    Random rnd1 = new Random();
    try {
        Thread.sleep(1000);
        lbl1.setText(String.valueOf(rnd1.nextInt(100)));
    } catch (InterruptedException inrptdEx) {
    }
}
}
4

2 に答える 2

2

dialog前に showButton と Label を表示するかどうかはわかりません。それらを表示するには、パネルを追加する必要があるためです。その後、Timerauto を処理する Classが必要disposeです。

tester1 は次のようになります

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class tester1 extends JDialog implements ActionListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    JLabel lbl1;

    JButton showButton;

    public tester1(JFrame owner) {
        super(owner, "tester1", true);
        JPanel jPanel = new JPanel();
        jPanel.setLayout(new BorderLayout());
        this.add(jPanel);

        showButton = new JButton("Show Number");
        showButton.addActionListener(this);
        lbl1 = new JLabel();

        jPanel.add(showButton, BorderLayout.NORTH);
        jPanel.add(lbl1, BorderLayout.CENTER);
        this.setBounds(40, 50, 300, 400);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == showButton) {
            GenerateNumber();
        }
    }

    public void GenerateNumber() {
        Random rnd1 = new Random();
        lbl1.setText(String.valueOf(rnd1.nextInt(1000000)));
        Timer timer = new Timer(1000 * 1, new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                dispose();
            }
        });
        timer.setRepeats(false);
        timer.start();
    }
}
于 2013-02-19T10:28:42.830 に答える
2

少し遅れて 2 番目のフレームを自動的に閉じることを意図している場合は、javax.swing.Timer代わりに a を使用する必要があります。

EDT をブロックすると、(とりわけ) 再描画要求の処理が停止されます。つまり、UI を更新できるときに更新できません。Thread.sleep

代わりに、javax.swing.Timer

public void GenerateNumber() {
    Random rnd1 = new Random();
    try {
        lbl1.setText(String.valueOf(rnd1.nextInt(100)));
    } catch (InterruptedException inrptdEx) {
    }
    Timer timer = new Timer(1000, new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            dispose();
        }
    });
    timer.setRepeats(false);
    timer.start();
}
于 2013-02-19T10:10:11.630 に答える