我最初询问的内容并没有明确说明我的问题/问题,因此我将对其进行更好的解释。我有一个JButtonJDialog设置为可见。 JDialog具有一个WindowListener,可将其设置为在windowDeactivated()事件上不可见,只要用户在对话框外单击即可触发该事件。按钮ActionListener检查对话框是否为可见,如果为true,则将其隐藏,如果为false,则将其显示。

只要用户在对话框外单击,windowDeactivated()将始终触发是否单击按钮。我遇到的问题是用户单击按钮以关闭对话框。该对话框由WindowListener关闭,然后ActionListener尝试显示该对话框。

如果windowDeactivated()不是setVisible(false),则对话框仍处于打开状态,但在父窗口后面。我要问的是如何访问windowDeactivated()内部的click位置。如果我知道用户单击了按钮,则windowDeactivated()可以跳过隐藏对话框,以便按钮的ActionListener将看到它仍然可见并将其隐藏。

公共(public)PropertiesButton扩展了JButton {

私有(private)JDialog theWindow;

公共(public)PropertiesButton(){
theWindow = new JDialog();
theWindow.setUndecorated(true);
theWindow.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
theWindow.add(new JMenuCheckBoxItem(“Something”)));
theWindow.addWindowListener(new WindowListener(){
//只是一个例子,需要实现其他方法
public void windowDeactivated(WindowEvent e){
theWindow.setVisible(false);
}
});
this.addActionListener(new ActionListener(){
公共(public)无效actionPerformed(ActionEvent e){
如果(theWindow.isVisible()){
theWindow.setVisible(false);
} 别的 {
JButton btn =(JButton)e.getSource();
theWindow.setLocation(btn.getLocationOnScreen.x,btn.getLocationOnScreen.x-50);
theWindow.setVisible(true);
}
}
});
theWindow.setVisible(false);
}

}

最佳答案

您可以尝试使用JPanel代替JDialog作为下拉列表属性列表。像这样的东西:

public class PropertiesButton extends JButton {

    private JPanel theWindow;

    public PropertiesButton() {
        theWindow = new JPanel();
        theWindow.add(new JMenuCheckBoxItem("Something"));

        this.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (theWindow.isVisible()) {
                    theWindow.setVisible(false);
                    getParent().remove(theWindow);
                } else {
                    JButton btn = (JButton)e.getSource();
                    getParent().add(theWindow);
                    theWindow.setBounds(
                       btn.getX(),
                       btn.getY() + btn.getHeight(), 100, 100);

                    theWindow.setVisible(true);
                }
            }
        });
        theWindow.setVisible(false);
    }

}

在Swing中,始终首选使用轻量级组件代替重量级组件,例如JDialog,并且减少不良影响,如您报告的那样。这种方法的唯一问题是面板的位置和大小可能会受到父级中激活的布局管理器的影响。

关于java - 创建一个检查属性窗口,将按钮驱动为JDialog,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4195395/

10-09 09:27