简体   繁体   English

JButton和JLabel在JDialog上不显示,并且睡眠不起作用

[英]JButton and JLabel don't show on JDialog and sleep not work

I have a frame that when i click ok button on tester2 frame, tester1 frame should be seen and when click showbumber button, a random number should be displayed in my label. 我有一个框架,当我单击tester2框架上的“确定”按钮时,应该看到tester1框架,而当单击showbumber按钮时,应该在我的标签中显示一个随机数。

But i can't see this generated number while i use sleep method! 但是我在使用睡眠方法时看不到这个生成的数字!

Thank for help. 感谢您的帮助。

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);
}
}

tester 1: 测试人员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) {
    }
}
}

If your intention is to close the second frame automatically after a short delay, you should use a javax.swing.Timer instead. 如果您打算在短暂延迟后自动关闭第二帧,则应改用javax.swing.Timer

Blocking the EDT will stop it from (amongst other things) processing repaint request, which means your UI can't be updated when you can Thread.sleep 阻止EDT将阻止它(除其他事项外)处理重画请求,这意味着当您可以使用Thread.sleep时无法更新您的UI。

Instead you should use a javax.swing.Timer 相反,您应该使用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();
}

I don't if your dialog shows the showButton and Label before. 如果您的dialog显示了showButton和Label,则不会。 Because i have to add a panel in order to show them. 因为我必须添加一个面板才能显示它们。 After that you need a Timer Class to deal with auto dispose . 之后,您需要一个Timer类来处理自动dispose

Your tester1 look now like this 您的测试人员1现在看起来像这样

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();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM