【问题标题】:Closing a Window with Button用按钮关闭窗口
【发布时间】:2012-05-14 19:02:54
【问题描述】:

我目前正在学习Java 以提高自己。我有一个程序,它有一个主窗口、菜单和子菜单。

当我点击我的子菜单时,我打开了其他窗口。

其中一个是 setRates

public SetMyRates(){
    JPanel dataPanel = new JPanel(new GridLayout(2, 2, 12, 6));
    dataPanel.add(setTLLabel);
    dataPanel.add(setDollarsLabel);
    dataPanel.add(setTLField);
    dataPanel.add(setDollarsField);
    JPanel buttonPanel = new JPanel();
    buttonPanel.add(closeButton);
    buttonPanel.add(setTLButton);
    buttonPanel.add(setDollarsButton);
    Container container = this.getContentPane();
    container.add(dataPanel, BorderLayout.CENTER);
    container.add(buttonPanel, BorderLayout.SOUTH);
    setTLButton.addActionListener(new SetTL());
    setDollarsButton.addActionListener(new SetDollars());
    closeButton.addActionListener(new closeFrame());
    dataPanel.setVisible(true);
    pack();
}

当我点击我的closeButton 时,我希望该窗口关闭。

我为closeButton创建了一个类actionListener,它是:

private class closeFrame implements ActionListener{
    public void actionPerformed(ActionEvent e){
       try{
          dispose();
       }
       catch(Exception ex){
          JOptionPane.showMessageDialog(null, "Please enter correct Rate.");
       }
    }
}

但是当我单击该按钮时,它会关闭我的主窗口而不是我的子菜单窗口。我应该怎么做才能解决这个问题?

【问题讨论】:

  • “子菜单窗口”是什么类?是JFrame吗? SetMyRates 方法是谁的成员? sumbenu 窗口还是主窗口?

标签: java swing window dispose actionlistener


【解决方案1】:

您需要获取对要关闭的窗口的引用并直接在该引用上调用dispose()。您如何执行此操作将取决于您的计划的详细信息——我们目前不知道的信息。

编辑:获得该参考的一种方法是通过SwingUtilities.getWindowAncestor(...)。传入从 ActionEvent 对象返回的 JButton 引用并对其调用 dispose。比如……

public void actionPerformed(ActionEvent e) {
  Object o = e.getSource();
  if (o instanceof JComponent) { 
    JComponent component = (JComponent)o; 
    Window win = SwingUtilities.getWindowAncestor(component);
    win.dispose();
  }
}
  • 警告:代码既未编译,也未运行,也未以任何方式测试。
  • 另请注意,要使其工作,保存和激活 ActionListener 的组件必须驻留在您希望关闭的窗口上,否则这将不起作用。

【讨论】:

  • +1 是第一个并教我SwingUtilities.getWindowAncestor(...) 我不知道这一点。谢谢。当您单击按钮并且它在主窗口中时,它不会总是返回主窗口吗?但是,如果您要使用您的代码并将此按钮添加到每个打开的窗口,那么它会很好用,但同样,如果您不隐藏装饰,您是否需要窗口上的关闭按钮?
  • @Boro:我的大部分 Swing 应用程序中都有退出按钮,所以虽然它们不是绝对必要的,但我发现它们很有用。
【解决方案2】:

我认为在打开另一个窗口时您可以轻松地存储对它的引用并在动作侦听器中使用它。大致如下:

JFrame openedWindow;

//inside the listener
if(openedWindow)
   openedWindow.dispose();
else dispose();

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多