0

我有class main extends jframe,它有一个按钮,可以调用/显示另一个扩展的类jdialog

如果按钮 fromjdialog被触发,它将处理该对话框并删除 的所有组件jframe,然后将其添加到新的jpanel.

我该怎么办?

这是我的新破代码:

public class mainz extends JFrame{
mainz(){
    setVisible(true);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    JToolBar r = new JToolBar();
    r.add(Box.createHorizontalGlue());
    add(r, BorderLayout.NORTH);

    JButton n = new JButton();
    r.add(n, BorderLayout.EAST);

    n.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae){
            show();
        }
    });
}

public void  show(){
    dialogz d = new dialogz(this);
    d.setVisible(true);
}

public void lastHope(){
    getContentPane().removeAll();
    getContentPane().validate();
    getContentPane().repaint();
}

public static void main (String[]args){
    new mainz().setExtendedState(MAXIMIZED_BOTH);
}

}

public class dialogz extends JDialog{
public dialogz(final mainz owner) {
    setSize(300, 300);
    JButton n = new JButton("execute");
    add(n);

    final JFrame ew = (JFrame)super.getOwner();// <<

    n.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae){
            dispose();
            //owner.lastHope;
            ew.removeAll();// <<
            ew.validate();// <<
            ew.repaint();// <<
        }
    });
}

void yes(){
    getOwner().removeAll();

    getOwner().validate();
    getOwner().repaint();
}

}

我知道我可以阻止我的main课程扩展jframe,而是从 main 调用它,但我想这样做......

请帮帮我...TT

对不起我的英语,我来自遥远的国家〜,〜”

更新:错误是

java.lang.ClassCastException:javax.swing.SwingUtilities$SharedOwnerFrame 无法转换为 javax.swing.JFrame

它将通过删除包含 // << 然后调用 lastHope(); 的行来完成

但我认为还有另一种方法可以让现有的 jframe 全部删除(通过先转换它或其他东西〜,〜“)

4

2 回答 2

2

我不清楚您的目标是什么,但是如果您想更改容器中显示的组件,例如 JFrame 或 JDialog 的 contentPane,那么我建议您使用CardLayout来执行此操作,因为它允许您轻松交换“意见”。

可能有两种方法可以做到这一点:

  • 您的 JDialog 类可以使用对通过其构造函数传入的 JFrame 的引用(然后您应该立即将其传递给对话框的super构造函数,以便您的模态能够正常工作)。然后,您可以调用 JFrame 类中的任何公共方法。
  • 或者由于 JDialog 是模态的,JFrame 的代码将在对话框可见时停止。您可以在对话框被处理且不再可见后立即交换“视图”。这会将 JFrame 操作代码保留在 JFrame 类中。
  • 编辑:请注意,如果您不使用 CardLayout,那么您有责任在任何更改其组件的容器上调用revalidate()和。repaint()

顺便说一句:由于英语不是您的母语,也不是本论坛许多人的母语,请避免使用非标准缩写。您与我们的沟通越清晰,我们就越容易理解您并为您提供帮助。

于 2012-09-27T02:35:07.270 回答
2

您正在打电话getParent(),但您从未设置父母(或所有者)。正如已经指出的那样,这应该发生在构造函数中。另外,请注意getParent()返回一个Container对象并getOwner()返回一个Window对象。这两个都是指作为父级和所有者的 JFrame。如果要将其用作 JFrame,则必须将输出转换为(JFrame). 但是removeAll()Container课堂上,所以如果这就是你想要的,就不需要选角了。

更新

JFrame frame = new JFrame();
JDialog dialog = new JDialog(frame);//frame is owner

JFrame parentOfDialog = (JFrame)(dialog.getParent());
//OR
//JFrame parentOfDialog = (JFrame)(dialog.getOwner());
parentOfDialog.removeAll();

如果您使用的是自定义类,请传入JFrame构造函数并调用super.

在尝试使用它之前,请阅读JDialog上的 javadoc。另外,请阅读有关继承的更多信息。

于 2012-09-27T03:27:27.740 回答