JFrame上的按钮是可点击的,但JDialog已启动

时间:2014-01-31 12:06:27

标签: java swing user-interface focus jdialog

有一个带有Button的JFrame,如果按下该按钮,则弹出一个JDialog。 如果我点击JFrame JDialog处理。但是如果JDialog处于活动状态并且我单击JButton,则释放JDIalog并再次打开它。 我想用JButton关闭JDialog。 感谢

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.event.*;

public class Frame extends JFrame {

    private JButton jButton;
    private JLabel jLabel = new JLabel("Test");
    private JDialog jDialog;

    public Frame() {
        getContentPane().add(jLabel);
        getContentPane().add(getButton(), BorderLayout.EAST);
        this.setSize(300,300);
        this.setVisible(true);
    }

    private JButton getButton() {
        if (jButton == null) {
            jButton = new JButton("TestButton");
            jButton.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    button_Pressed();
                }
            });
        }
        return jButton;
    }

    private JDialog getJDialog() {
        if (jDialog == null) {
            jDialog = new JDialog();
            jDialog.setSize(150, 25);
            jDialog.setUndecorated(true);
            jDialog.addWindowListener(new WindowListener() {

                @Override
                public void windowOpened(WindowEvent e) {
                }

                @Override
                public void windowIconified(WindowEvent e) {
                }

                @Override
                public void windowDeiconified(WindowEvent e) {
                }

                @Override
                public void windowDeactivated(WindowEvent e) {
                    jDialog.dispose();
                }

                @Override
                public void windowClosing(WindowEvent e) {
                }

                @Override
                public void windowClosed(WindowEvent e) {
                }

                @Override
                public void windowActivated(WindowEvent e) {

                }
            });
        }

        return jDialog;
    }


    protected void button_Pressed() {
        getJDialog().setVisible(true);        
    }

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

}

1 个答案:

答案 0 :(得分:0)

您正在做的就是创建JDialog,但是您忘记给它声明的JDialog的引用,因此您无法再次引用它。所以在你的方法中,而不是这个

protected void button_Pressed() {
    getJDialog().setVisible(true);        
}

这样做

 protected void button_Pressed() {
    if (jDialog == null) {
        jDialog = getJDialog();
        jDialog.setVisible(true);
        return;
    }
    if (jDialog.isVisible()) {
        jDialog.setVisible(false);
    } else {
        jDialog.setVisible(true);
    }
}

侧面说明

  • Event Dispatch Thread (EDT)这样运行您的Swing应用

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                new Frame();
            }
        }); 
    }
    

    请参阅Initial Threads


<强>更新

由于您使用按钮控制流量,因此WindowListener没有意义。摆脱jDialog.dispose()中的windowClosing并且它有效。