java - 使用 JPanel 内的按钮关闭 JFrame 不起作用

标签 java swing

我正在尝试从 JFrame 中的 JPanel 上的按钮关闭 JFrame。 我四处寻找,但我尝试的一切都不起作用。

这是我在 JPanel 中的代码:

public class warningPanel extends JPanel{

    //Klassen
    warning warningClass = new warning();
    loginGeneral loginGen = new loginGeneral();

    //Buttons
    buttons btnOk;

    //JLabels
    JLabel lblText;

    public warningPanel(){
        setLayout(null);

        this.setBounds(0, 0, 300, 150);

        btnOk = new button.buttons(110, 100, 60, 30, "000003006", "120090040", "255255255");
        btnOk.setText("OK");
        btnOk.setFont(new Font("default", Font.BOLD, 12));      

        add(btnOk);


        btnOk.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {                
                warningClass.close();
            }

            public void mouseEntered(MouseEvent e) {
                btnOk.setBackground(loginGen.clGold);
            }

            public void mouseExited(MouseEvent e) {
                btnOk.setBackground(loginGen.clDarkBlue);
            }
        });

    }
}

这是我的 JFrame

public class warning extends JFrame{

    public void warningMessage(String warningtext){

        this.setSize(300, 150);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        this.setLocation(dim.width / 2 - this.getSize().width / 2, dim.height / 2 - this.getSize().height / 2);     
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.getContentPane().setBackground(new Color(1, 10, 19));
        this.setUndecorated(true);          

        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);


        warningPanel panel = new warningPanel();
        panel.setOpaque(false);
        panel.setBounds(0, 0, 300, 150);

        this.setVisible(true);
        this.add(panel);
    }       

    public void close(){
        this.setVisible(false);
        this.dispose();
    }

}

我真的不知道为什么这不起作用

最佳答案

回答问题:

警告框的实例与显示的实例不同,这意味着当您尝试关闭它时,它不是屏幕上的实例。

can't teach myself everything

好吧,那就来个小教训吧;)

您的 warningPanel 必须承担什么责任来关闭窗口(或根本更改窗口)?没有任何。它的唯一责任是将您的程序中的信息呈现给用户,并从用户处获取您的程序的信息。

我已经记不清自己开发过、让同事开发过或想要使用第三方组件的情况,该组件显示在大型 UI 的对话框中,并包含“好的”和“取消”按钮......好吧,重用就这么多了:P

在大多数情况下,组件(在您的情况下为 warningPanel)甚至不负责处理这些事情。让它专注于它必须完成的单一工作,这可能已经够难的了。

因此,在您的情况下,warningPanel 执行一项工作,显示一条消息...

public class WarningPanel extends JPanel {

    //JLabels
    private JLabel lblText;

    public WarningPanel(String text) {
        setLayout(new GridBagLayout());
        add(new JLabel(text));
    }
}

就是这样。

时不时地,我可能会遇到一种特殊情况,很明显面板应该显示在对话框中,当发生这种情况时,我通常提供一些实用方法来生成对话框并将管理包装成一个简单的使用方法,例如...

public class WarningPanel extends JPanel {

    //JLabels
    private JLabel lblText;

    public WarningPanel(String text) {
        setLayout(new GridBagLayout());
        add(new JLabel(text));
    }

    public enum DialogAction {
        OK, CANCEL, CLOSED
    }

    public static DialogAction showDialog(JComponent parent, String title, String message) {
        JDialog dialog = new JDialog(parent == null ? null : SwingUtilities.windowForComponent(parent));
        dialog.setTitle(title);
        WarningPanel pane = new WarningPanel(message);
        pane.setBorder(new EmptyBorder(4, 4, 4, 4));
        dialog.add(pane);

        JPanel buttonPane = new JPanel(new GridBagLayout());
        buttonPane.setBorder(new EmptyBorder(4, 4, 4, 4));

        State state = new State();

        JButton okBtn = new JButton("Ok");
        JButton cancelBtn = new JButton("Cancel");

        buttonPane.add(okBtn);
        buttonPane.add(cancelBtn);

        dialog.add(buttonPane, BorderLayout.SOUTH);

        DialogAction action = DialogAction.CLOSED;

        okBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                state.setState(DialogAction.OK);
                dialog.dispose();
            }
        });
        cancelBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                state.setState(DialogAction.CANCEL);
                dialog.dispose();
            }
        });

        dialog.pack();
        dialog.setLocationRelativeTo(parent);
        dialog.setVisible(true);

        return state.getState();
    }
}

这允许你像这样使用它......

switch (WarningPanel.showDialog(null, "Warning", "Something wicked this way comes")) {
    case OK:
        // Everything is okay
        break;
    case CANCEL:
        // User cancelled
    case CLOSED:
        // Window was closed
        break;

}

现在,这是一个想法的演示,就我个人而言,我通常会使用 JOptionPane 因为它基本上做同样的事情

您可能想看看:

关于java - 使用 JPanel 内的按钮关闭 JFrame 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41813858/

相关文章:

Java返回组件

java - 如何停止 CruiseControl 构建或更改配置以导致长时间运行的构建超时?

java - 为什么调用静态方法时用括号包裹类型是非法的?

java - 理解 HashMap 中 equals 和 hashCode 的工作原理

java - 将文本和表格写入单词,并使用空格/输入

java - AKKA 远程 actor 可以用于 p2p swarm 环境吗?

java - 如何修复此代码以便我可以将此 JFreeChart 添加到面板中

java - 使用 Java 及其 SWING 库

java - JLabel文本不显示

java - map 面板 : Java Swing Map API