2015-12-21 95 views
1

我有一個主框架,並在此框架內顯示其他面板。 但其中一個面板包含按鈕,目的是顯示另一個面板 - 如面板內的顯示面板。面板內的加載面板

這是面板的代碼,我想加載另一個面板:

public class PnlConnectionType extends JPanel { 

private JPanel cardPanel; 
private CardLayout cl; 

/** 
* Create the panel. 
*/ 
public PnlConnectionType() { 

    cardPanel = new JPanel(); 
    cardPanel.setBounds(new Rectangle(10, 11, 775, 445)); 

    cl = new CardLayout(); 
    cardPanel.setLayout(cl); 

    setBounds(new Rectangle(10, 11, 774, 465)); 
    setLayout(null); 

    JButton btnRS485 = new JButton("CONNECTION BY RS485"); 
    btnRS485.setBounds(20, 23, 266, 107); 
    add(btnRS485); 

    JButton btnNoConnectionoffline = new JButton("NO CONNECTION (OFFLINE)"); 
    btnNoConnectionoffline.setBounds(20, 159, 266, 107); 
    add(btnNoConnectionoffline); 

    final settingsPanel2 settPnl2 = new settingsPanel2(); 
    settPnl2.setBounds(new Rectangle(10, 11, 774, 465)); 
    settPnl2.setSize(775,465); 
    settPnl2.setBounds(10, 11, 775, 445); 

    cardPanel.add(settPnl2, "1"); 

    btnRS485.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      cl.show(cardPanel, "1");     
     } 
    });   
} 
} 

當我點擊按鈕面板上沒有顯示。我做錯了什麼?

+0

您正在使用空佈局,由於很多原因,這是麻煩的。看看[如何使用佈局管理器](https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html)。 – user1803551

回答

3

您的cardPanel永遠不會被添加到PclConnectionType面板。因此,雖然它能夠正確設置所需的內容,但它不是任何頂級窗口組件層次結構的一部分。

你應該做的是在PnlConnectionType面板本身設置CardLayout,並設計兩種佈局;一個與你想要顯示的面板,一個沒有它。然後,使用這些佈局將面板添加到PnlConnectionType面板,並顯示沒有settingsPanel2的面板。

或者,也可以在CardLayout面板中添加一個空的JPanel,並將其初始顯示。然後將其添加到PnlConnectionType。在開始時,它將顯示一個空白空間,您可以像現在一樣通過撥打show來填充所需的內容。

這裏是怎麼樣的代碼實現的例子:

//Create the card layout, and add a default empty panel 
final CardLayout cardLayout = new CardLayout(); 
final JPanel cardPanel = new JPanel(); 
cardPanel.setLayout(cardLayout); 
cardPanel.add(new JPanel(), "Empty"); 

//Create and add the contents which is initially hidden 
JPanel contents = new JPanel(); 
contents.setBackground(Color.BLUE); 
contents.setOpaque(true); 
cardPanel.add(contents, "Contents"); 

//Add the button and card layout to the parent 
setLayout(new BorderLayout()); 
final JButton toggle = new JButton("Show"); 
toggle.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      if(toggle.getText().equals("Show")){ 
       //Show contents 
       cardLayout.show(cardPanel, "Contents"); 
       toggle.setText("Hide"); 
      } else{ 
       //Hide Contents 
       cardLayout.show(cardPanel, "Empty"); 
       toggle.setText("Show"); 
      } 
     } 
    }); 
add(toggle, BorderLayout.SOUTH); 
add(cardPanel, BorderLayout.CENTER); 

查看如何我想說明一切在開始時加入,然後使用show透露,當我想要顯示它。

+0

你有一些例子如何做到這一點?這是我在.NET和winforms工作多年後第一次接觸swing。 – Josef

+0

@Josef我添加了一個基本的例子,展示瞭如何實現你想要的功能。而且Oracle提供了[一些教程](https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html),可以提供其他示例 – resueman