0

を持っています。class main extends jframe拡張する別のクラスを /shows するボタンがありますjdialog

のボタンjdialogがトリガーされると、そのダイアログが破棄され、 のすべてのコンポーネントが削除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代わりにメインから呼び出すことができることはわかっていますが、そのようにしたい...

助けてください... TT

私の英語でごめんなさい、私は遠い国から来ました~,~"

更新:エラーは

java.lang.ClassCastException: javax.swing.SwingUtilities$SharedOwnerFrame を javax.swing.JFrame にキャストできません

// << を含む行を削除してから、lastHope(); を呼び出します。

しかし、既存のjframeをremoveallにする別の方法があると思います(最初にキャストするか、何か~、~")

4

2 に答える 2

2

あなたの目標が明確ではありませんが、コンテナに表示されるコンポーネント (JFrame や JDialog の contentPane など) を変更する場合は、CardLayoutを使用してこれを行うことをお勧めします。簡単に「ビュー」を交換します。

これを行うには、次の 2 つの方法があります。

  • JDialog クラスは、コンストラクターを介して渡される JFrame への参照を使用できます (superモダリティが正しく機能するように、すぐにダイアログのコンストラクターに渡す必要があります)。その後、JFrame のクラスでパブリック メソッドを呼び出すことができます。
  • または、JDialog はモーダルであるため、ダイアログが表示されている間は JFrame のコードが停止します。ダイアログが破棄されて表示されなくなった直後に、「ビュー」を交換できます。これにより、JFrame クラス内の JFrame 操作コードが保持されます。
  • 編集: CardLayout を使用しない場合は、コンポーネントを変更するコンテナーを呼び出す責任があることに注意してrevalidate()くださいrepaint()

余談ですが、英語はあなたの母国語ではなく、このフォーラムの多くの人の母国語でもありません。標準的でない略語の使用は避けてください。私たちとのコミュニケーションが明確であるほど、私たちはあなたを理解し、あなたを助けることが容易になります.

于 2012-09-27T02:35:07.270 に答える
2

呼び出しgetParent()ていますが、親 (または所有者) を設定していません。すでに指摘したように、それはコンストラクターで発生するはずです。また、オブジェクトを返しgetParent()、オブジェクトを返すことに注意してください。これらは両方とも、親であり所有者である JFrame を参照します。JFrame として使用する場合は、出力を としてキャストする必要があります。しかし、それはクラス内にあるので、それで十分であれば、キャストする必要はありません。ContainergetOwner()Window(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 を使用する前に、 JDialogの javadoc をお読みください。また、継承についてもお読みください。

于 2012-09-27T03:27:27.740 に答える