2012-12-28 43 views
0

請問,爲什麼添加到JFrame時爲什麼JPanel等組件不可見?這裏是我的代碼:組件在JFrame中是不可見的

public class GUI{ 
static JPanel panel = new JPanel(); 
private void createAndShowGUI() { 

    final ImageIcon zielonaikona = new ImageIcon("kulazielona.png"); 
    JFrame frame1 = new JFrame("MasterMind"); 
    JRadioButton zielony = new JRadioButton(zielonaikona); 
    zielony.setSelected(true); 
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JButton akceptuj = new JButton("Akceptuj"); 

    akceptuj.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) 
     { 
      JLabel label2 = new JLabel(zielonaikona);    
      panel.add(label2); 
     } 
    });  


    BoxLayout layout = new BoxLayout(panel, BoxLayout.Y_AXIS); 
    panel.add(akceptuj); 
    panel.setLayout(layout); 
    panel.add(zielony); 
    JLabel label = new JLabel (zielonaikona); 
    panel.add(label); 
    frame1.getContentPane().add(panel); 
    frame1.getContentPane().add(akceptuj); 
    frame1.getContentPane().add(zielony); 
    frame1.setSize(200, 300); 
    frame1.setVisible(true); 

} 

public static void main(String[] args) { 

    GUI kk = new GUI(); 
    kk.createAndShowGUI(); 
} 
} 

回答

3

您添加控件到JFrame還有JPanelpanel,所以它們只會出現在最後容器它們被添加,即幀。此外,因爲在默認BorderLayout.CENTER位置添加它們每一個取代過去的,所以你只與顯示的一個分量(JRadioButtonzielony

要修復,刪除線左:

frame1.getContentPane().add(akceptuj); 
    frame1.getContentPane().add(zielony); 

Aside:當在飛行中添加新組件(即在ActionListener中添加了JLabel),請不要忘記撥打:

panel.revalidate(); 
panel.repaint(); 
+0

它也容易讓人糊塗添加組件到'JPanel'之間改變佈局。儘量不要那樣做。原始代碼可以簡化很多。 –

+0

@reimeus OP「不應該」需要調用重新驗證和重繪,因爲它們不會將框架設置爲可見狀態,直到它們完成添加組件之後才進行重新驗證和重繪,這會進行很好的更改。 +1 – MadProgrammer

+0

@MadProgrammer我指的是'ActionListener'中加入的'JLabel' ... :) – Reimeus

1

該按鈕和單選按鈕被添加兩次,面板和框架。你沒有在框架上設置佈局,但我認爲它有一個默認的。我只是不記得是什麼樣的。

這是你的代碼是錯誤的。

panel.add(akceptuj); 
panel.add(zielony); 

frame1.getContentPane().add(akceptuj); 
frame1.getContentPane().add(zielony); 
+0

組件只能位於一個容器內。將組件添加到第二個容器將從第一個容器中移除它們。默認的佈局。框架通常是BorderLayout,對於JPanel,通常是FlowLayout – MadProgrammer

+0

@MadProgrammer添加了一條註釋,說明我所顯示的代碼是原始問題中錯誤的部分。 –

+0

@Lee Meador和MadProgrammer謝謝,我不知道JFrame有默認的佈局。 –