我正在尝试从 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/