2013-11-03 65 views
-2

我創建了一個包含一個JPanel的類,該類將用於CardLayout,如果刪除註釋//其代碼底部具有窗口大小,此工作正常。它將以這種方式運行,並且所有功能都完美無缺但是,當我嘗試從另一個具有JFrame的類中調用它時,它不起作用。在另一個類的JFrame中調用JPanel

CardDemo.java:

import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 
import java.awt.*; 

public class CardDemo extends JPanel implements ListSelectionListener { 

CardLayout cl; 
JPanel p1, p2, p3, p4, p5; 
JList l1; 


public CardDemo(){ 

    p1 = new JPanel(); 
    p1.setBackground(Color.red); //the top panel 

    String[] list1 = { "One", "Two", "Three"}; 
    l1 = new JList(list1); 
    l1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    l1.addListSelectionListener(this); 

    p1.add(l1); 

    p2 = new JPanel(); 
    p2.setBackground(Color.blue); //bottom panel - we never actually see this 

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


    p3 = new JPanel(); 
    p3.setBackground(Color.green); 
    p4 = new JPanel(); 
    p4.setBackground(Color.yellow); 
    p5 = new JPanel(); 
    p5.setBackground(Color.cyan); 


    p2.add(p3, "One"); 
    p2.add(p4, "Two"); 
    p2.add(p5, "Three"); 

    //this.setSize(500,400); 
    //this.setVisible(true); 
    this.setLayout(new GridLayout(2,2)); 
    this.add(p1); 
    this.add(p2); 

} 

/** The actionPerformed method handles button clicks 
*/ 
public void valueChanged(ListSelectionEvent e) { 
    String listLabel = (String) ((JList)e.getSource()).getSelectedValue(); //get the label of the button that was clicked 
    cl.show(p2, listLabel);    //use the label to display the relevant panel 
} 
} 

Test.java

import javax.swing.*; 
import java.awt.*; 

public class Test extends JFrame 
{ 

public Test() 
{ 
    JFrame frame = new JFrame("CardLayoutDemo"); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 

    CardDemo b = new CardDemo(); 
    b.add(frame); 

    frame.pack(); 
    frame.setVisible(true); 
} 


} 

一切編譯就好了,但是當我運行Test.java我得到以下錯誤:

的java.lang .IllegalArgumentException: 向容器添加一個窗口(在java.awt.Container中)

什麼是我做錯了,因爲我似乎無法找到它。

+0

關於'「請勿批准這是我不希望這保存在這裏,我想刪除這之後AS I DON」 T希望我的工作留在網上,很高興。「' - 你不能這樣做。如果在這裏發佈,它應該留在這裏,因爲這裏發佈的問題不僅僅是爲了您的利益,而是針對所有未來的訪問者有類似的問題。我已經從你的問題中刪除了這個,所以毫無疑問。 –

+0

問題回滾到以前的狀態。請不要更改您的代碼而無需解釋。 –

+0

沒有人會偷你的代碼。無論如何,我堅持我以前的評論,這些問題不僅僅是爲了提問者的利益,而主要是爲了這個網站的未來訪問者。 –

回答

0

您正在將您的JFrame添加到您的JPanel。它應該是相反的。框架變量指的是一個頂層窗口JFrame。這是所有組件的頂級容器,因此您需要向其添加組件,而不是相反。