2011-06-30 83 views
4

我已經寫了這個簡單的Cardlayout示例與Splitpane,Combobox和幾個其他面板包含按鈕和標籤。CardLayout不能正常工作

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Container; 
import java.awt.EventQueue; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 

import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSplitPane; 
import javax.swing.JTextField; 
import javax.swing.border.EmptyBorder; 

public class splitpane_test extends JFrame implements ItemListener { 

    private JPanel contentPane; 
    final static String BUTTONPANEL = "Card with JButtons"; 
    final static String TEXTPANEL = "Card with JTextField"; 
    JPanel cards; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       try { 
        splitpane_test frame = new splitpane_test(); 
        //frame.addComponentToPane(frame.getContentPane()); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public splitpane_test() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JSplitPane splitPane = new JSplitPane(); 
     contentPane.add(splitPane, BorderLayout.CENTER); 


     JPanel comboBoxPane = new JPanel(); 
     String comboBoxItems[] = {BUTTONPANEL, TEXTPANEL}; 
     JComboBox cb = new JComboBox(comboBoxItems); 
     cb.setEditable(false); 
     cb.addItemListener(this); 
     comboBoxPane.add(cb); 
     splitPane.setLeftComponent(comboBoxPane); 

     //Create the "cards". 
     JPanel card1 = new JPanel(); 
     card1.add(new JButton("Button 1")); 
     card1.add(new JButton("Button 2")); 
     card1.add(new JButton("Button 3")); 

     JPanel card2 = new JPanel(); 
     card2.add(new JTextField("TextField", 20)); 

     //Create the panel that contains the "cards". 
     cards = new JPanel(); 
     cards.add(card1, BUTTONPANEL); 
     cards.add(card2, TEXTPANEL); 
     splitPane.setRightComponent(cards); 
     cards.setLayout(new CardLayout(0, 0)); 
    } 

    @Override 
    public void itemStateChanged(ItemEvent e) { 
     // TODO Auto-generated method stub 
     System.out.print("Event Triggered \n"); 
     CardLayout cl = (CardLayout) (cards.getLayout()); 
     cl.show(cards, TEXTPANEL); 
    } 
} 

我可以看到左側的組合框和右側的其他卡片佈局面板上的分離面板。 當我更改組合框項目沒有正確的大小發生。 爲了驗證iam是否擊中了我使用的System.out.print(「觸發的事件\ n」); 但我已經看到了令人驚奇的是,它的每一個組合框項目變更顯示兩倍,如果調用兩次

 
Event Triggered 
Event Triggered 

能否請你建議我什麼IAM做錯了,爲什麼事件觸發被擊中兩次。 感謝您的所有時間和幫助。

+1

+1 [SSCCE(http://sscce.org/) 。 – trashgod

回答

3
  1. 在添加組件之前設置佈局管理器。

  2. 兩個項目正在改變狀態;一個正在被取消選擇,另一個被選中。你會提高你的調試輸出下列要求:

    System.out.println("Event Triggered: " + e);

您還需要考慮到事件切換回選擇 - 而不是在組合框中的所有改變應該選擇TEXTPANEL

+0

我試圖用JTree替換組合框,看它是否可以做同樣的事情,但它似乎並沒有工作。代碼CardLayout c1 =(CardLayout)(cards.getLayout()); \t \t DefaultMutableTreeNode sel =(DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); \t \t如果(sel.isLeaf()){ \t \t \t的System.out.println(SEL + e.getSource()的toString()); \t \t \t c1.show(cards,sel.toString()); \t \t} ' 我可以看到正在調用的面板,但是卡片佈局不會改變。如果我手動使用面板名稱,它就可以工作。請告訴我我正在做的錯誤。非常感謝你的幫助。 – kdev

+0

看看'DefaultMutableTreeNode。getUserObject()' –

+0

感謝您的答案,但它似乎並沒有工作。代碼 public void valueChanged(TreeSelectionEvent e){ \t \t CardLayout c1 =(CardLayout)(cards.getLayout()); \t \t DefaultMutableTreeNode node =(DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); (node.isLeaf()){ \t \t if(node.isLeaf()){ \t \t \t System.out.println(node.getUserObject()); \t \t \t c1.show(cards,(String)node.getUserObject()); \t \t}' – kdev

4

你能告訴我我在做什麼錯了嗎?爲什麼事件觸發了兩次。

如果你看一下ItemEvent,你會看到一個項目正在DESELECTED,另一種是被SELECTED。相反,請聽ActionEvent,如here所示,並相應地選擇正確的卡片。

附錄:如果您實現的有益變化@邁克爾 - 布魯爾 - 戴維斯的answer,那麼合適的ActionListener特別簡單:

@Override 
public void actionPerformed(ActionEvent e) { 
    JComboBox jcb = (JComboBox) e.getSource(); 
    CardLayout cl = (CardLayout) cards.getLayout(); 
    cl.show(cards, jcb.getSelectedItem().toString()); 
} 
+0

感謝您的幫助 – kdev