使用JPanel内的按钮关闭JFrame无法正常工作

时间:2017-01-23 19:11:46

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

}

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

1 个答案:

答案 0 :(得分:1)

回答这个问题:

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

  

无法自学一切

好的,那么一点教训;)

您的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因为它基本上做同样的事情

您可能需要查看: