簡體   English   中英

如何從擴展JDialog的另一個類中調用已存在的活動框架,然后刪除其所有組件?

[英]how to call active frame that already exist from another class that extends JDialog then remove all of its component?

我有一個class main extends jframe ,它有一個按鈕,它調用/顯示另一個擴展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 ,而改為從main調用它,但是我想那樣做...

請幫助我... TT

抱歉,我是來自遙遠國家的英語,~~~”

更新:錯誤是

java.lang.ClassCastException:javax.swing.SwingUtilities $ SharedOwnerFrame無法轉換為javax.swing.JFrame

刪除包含// <<的行,然后調用lastHope()即可。

但是我認為還有另一種方法可以使現有的jframe刪除全部(通過先轉換它或類似的東西〜,〜“)

我不清楚您的目標是什么,但是如果您想更改容器中顯示的組件(例如JFrame或JDialog的contentPane),那么我建議您使用CardLayout來執行此操作,因為它允許您輕松交換“視圖”。

可能有兩種方法可以做到這一點:

  • 您的JDialog類可以使用對JFrame的引用,該引用是通過其構造函數傳遞的(然后應立即將其傳遞到對話框的super構造函數中,以使您的模態正確運行)。 然后,您可以在JFrame的類中調用任何公共方法。
  • 或者,由於JDialog是模態的,因此對話框可見時JFrame的代碼將停止。 您可以在處理完對話框且不再可見后立即交換“視圖”。 這會將JFrame操作代碼保留在JFrame類中。
  • 編輯:請注意,如果您不使用CardLayout,則您有責任在更改其組件的任何容器上調用revalidate()repaint()

順便說一句:由於英語不是您的母語,也不是該論壇上許多人的母語,因此請避免使用非標准縮寫。 您與我們的交流越清晰,我們就越容易理解您並為您提供幫助。

您正在調用getParent()但從未設置父級(或所有者)。 如前所述,這應該在構造函數中發生。 另外,請注意, getParent()返回一個Container對象,而getOwner()返回一個Window對象。 這兩個都引用了作為父級和所有者的JFrame。 如果要將其用作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。 另外,請閱讀有關繼承的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM