有一个带有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();
}
}
答案 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();
}
});
}
<强>更新强>
由于您使用按钮控制流量,因此WindowListener
没有意义。摆脱jDialog.dispose()
中的windowClosing
并且它有效。