2014-09-29 96 views
0

我想用按鈕調用我的JPanel。我的Jpanel實際上是來自主面板的子佈局,具有卡片佈局。JButton不會顯示JPanel

要做到這一點,我使用卡布局API方法HERE來顯示單擊按鈕後的JPanel。

JButton btnCallPanel1 = new JButton("Call PanelOne"); 
    btnCallPanel1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 

      CardLayout card = (CardLayout)mainPanel.getLayout(); 
      card.show(mainPanel, "PanelOne");      //call Panel One 

     } 

輸出:

沒有出現,面板沒有叫並且沒有錯誤彈出。

我的代碼是HERE

package wan.dev.sample.cardlayout; 

import java.awt.CardLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

import javax.swing.JLabel; 

public class HowToUseCardLayout { 

    private JFrame frame; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        HowToUseCardLayout window = new HowToUseCardLayout(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public HowToUseCardLayout() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 688, 358); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setBounds(0, 0, 672, 260); 
     frame.getContentPane().add(mainPanel); 
     mainPanel.setLayout(new CardLayout(0, 0)); 

       JPanel PrePanel = new JPanel(); 
       mainPanel.add(PrePanel, "name_246268073832057"); 
       PrePanel.setLayout(null); 

         JLabel lblPanel_1 = new JLabel("Pre Panel"); 
         lblPanel_1.setBounds(280, 115, 57, 20); 
         PrePanel.add(lblPanel_1); 

     JPanel panelOne = new JPanel(); 
     mainPanel.add(panelOne, "name_246268067657434"); 
     panelOne.setLayout(null); 

     JLabel lblPanel = new JLabel("panel 1"); 
     lblPanel.setBounds(279, 118, 46, 14); 
     panelOne.add(lblPanel); 

     JButton btnPan1 = new JButton("Call PanelOne"); 
     btnPan1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       CardLayout card = (CardLayout) mainPanel.getLayout(); 
       card.show(mainPanel, "PanelOne"); 

      } 
     }); 
     btnPan1.setBounds(262, 286, 144, 23); 
     frame.getContentPane().add(btnPan1); 
    } 
} 

ANSWER

我不能叫我的面板,因爲我沒有使用標識符調用它的原因。 我得給標識的名字我的願望JPanel並使用我cardLayout.show(..)

Public Static final String PANEL_ONE = "panel one";     //Name of JPanel Identifier 


//add panel to main panel and declare panelOne identifier 
mainPanel.add(panelOne, PANEL_ONE);       //PANEL_ONE function like 
                  //an identifier 


JButton btnCallPanel1 = new JButton("Call PanelOne"); 
btnCallPanel1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 

     CardLayout card = 
        (CardLayout)mainPanel.getLayout(); 

     card.show(mainPanel, PANEL_ONE);      //call panelOne using PANEL_ONE 
                  //instead of JPanel name 

    } 
+0

你能解釋一下顯示的功能呢? – 2014-09-29 03:02:47

+0

你顯示了一段代碼,但我沒有看到它足以診斷你的問題,所以看起來這個問題可能是一個''猜測我沒有向你展示的代碼是在做什麼「類型的問題。請通過創建併發布您的[最小代碼示例程序](http://stackoverflow.com/help/mcve)來修復此問題,以便我們進行審查,測試並可能進行修復。 – 2014-09-29 03:03:01

+2

@KickButtowski:'show(...)'方法是CardLayout方法。他的使用沒有問題,除非他的字符串文字參數是關閉的,我不能說這是否基於所呈現的代碼片段。我自己,我喜歡在調用此方法時使用String常量,以避免出現拼寫錯誤或大寫字母問題。 – 2014-09-29 03:04:10

回答

4

正如我懷疑標識符 - 你調用CardLayout.show(...)方法與String參數「PanelOne」但是你還沒有使用這個相同的字符串將任何組件添加到使用CardLayout的容器中,所以這是行不通的。解決方案:不要這樣做。使用您使用容器將該組件添加到CardLayout的相同字符串作爲您用來顯示它的那個字符串。

即,如果你想顯示容器foo和使用String"bar"將其添加到CardLayout - 使用容器,則必須通過「酒吧」到CardLayoutshow(...)方法。同樣,使用String常量來減少混亂的可能性。

其他問題:您正在使用null佈局和setBounds - 不要。這樣做會導致非常不靈活的GUI,雖然它們可能在一個平臺上看起來不錯,但在大多數其他平臺或屏幕分辨率上看起來很糟糕,而且很難更新和維護。

例如,

import java.awt.CardLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 

public class CardLayoutFoo extends JPanel { 
    public static final String BAR = "bar"; 
    public static final String BUTTON_PANEL = "button panel"; 
    private CardLayout cardlayout = new CardLayout(); 

    public CardLayoutFoo() { 
     setLayout(cardlayout); 

     JLabel fooLabel = new JLabel("Foo", SwingConstants.CENTER); 
     add(fooLabel, BAR); // added using String constant, BAR 

     JButton showFooBtn = new JButton(new AbstractAction("Show Foo") { 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      // use same String, BAR, to get the fooLabl shown 
      cardlayout.show(CardLayoutFoo.this, BAR); 
     } 
     }); 
     JPanel btnPanel = new JPanel(); 
     btnPanel.add(showFooBtn); 
     add(btnPanel, BUTTON_PANEL); 

     cardlayout.show(this, BUTTON_PANEL);    
    } 

    private static void createAndShowGui() { 
     CardLayoutFoo mainPanel = new CardLayoutFoo(); 

     JFrame frame = new JFrame("CardLayoutFoo"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

+1是......沒有'add()'。 – karlphillip 2014-09-29 03:20:58

+0

@Hovercraft Full Of Eels「其他問題:您正在使用空白布局和setBounds - 不要。」 什麼佈局最適合我使用?以及如何避免使用setbound,如果我們想要將jframe或按鈕設置爲我們所需的尺寸 – 2014-09-29 04:49:24

+1

@beNice:沒錯,「不要」。您將需要閱讀佈局管理器教程(Google可以幫助您或[swing標籤信息](http://stackoverflow.com/tags/swing/info)可以提供幫助),然後嵌套JPanel,每個JPanel都有其自己的佈局和組件。 – 2014-09-29 04:52:05