2014-01-29 103 views
0

現在我知道有很多這方面的問題,並且我讀了十幾個。但是我剛剛撞上了一堵牆,我無法做出正面或反面的評論。在JFrame中切換JPanels

繼承人我的問題。

我有3個面板類。

ConfigurePanel.java 
ConnectServerPanel.java 
RunServerPanel.java 

和我的JFrame類

StartUPGUI.java 

這是在啓動時初始化

private void initComponents() { 

    jPanel1 = new javax.swing.JPanel(); 
    startUp = new sjdproject.GUI.ConfigurePanel(); 
    runServer = new sjdproject.GUI.RunServerPanel(); 
    serverConnect = new sjdproject.GUI.ConnectServerPanel(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); 

    jPanel1.setLayout(new java.awt.CardLayout()); 
    jPanel1.add(startUp, "card2"); 
    jPanel1.add(runServer, "card4"); 
    jPanel1.add(serverConnect, "card3"); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
      .addContainerGap(27, Short.MAX_VALUE) 
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 419, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(38, 38, 38)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(27, 27, 27) 
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 281, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(30, Short.MAX_VALUE)) 
    ); 

我StartUPGUI首先調用StartUpPanel。在我StartUpPanel.java我有一個按鈕,它調用了StartUPGUI

StartUpGUI s = new StartUpGUI(); 
    String str = ""; 
    if(runserverbtn.isSelected()){ 
     str = "runserver"; 
    } 
    else if(connectserverbtn.isSelected()){ 
     str = "connectserver"; 
    } 
    else{ 
     str = ""; 
    } 
    s.setPanel(str); 

這裏setPanel方法是我setPanel方法

void setPanel(String str){ 
    if(str == "runserver"){ 

    } 
    else if(str == "connectserver"){ 

    } 

    else{ 
    } 
} 

什麼我需要把裏面的if塊來改變面板的看法?我會假設jPanel1.something(),但我不知道那是什麼。

+0

[這裏](http://docs.oracle.com/javase/7/docs/api/javax/swing/ JPanel.html)是一個您可以閱讀所有您可以在JPanel上使用的方法的地方。 – csmckelvey

+0

不要用==比較字符串,它不會工作。使用'.equals' ..'if(「runserver」.equals(str)){' –

+0

我覺得我已經通過了數百萬種方法。我在jPanel1.something()的正確軌道上? – ragingbull

回答

2

「我需要在if塊中更改面板視圖嗎?我會假設jPanel1.something(),但我不知道這是什麼東西。」

  1. 不要拿串==,它不會工作。使用.equals .. if("runserver".equals(str)){

  2. 您需要從CardLayout

    CardLayout.show(jPanel1, "whichPanel"); 
    
    • public void show(Container parent, String name)使用方法.show - 翻轉到已添加到該佈局具有指定名稱使用addLayoutComponent的組件。如果不存在這樣的組件,則沒有任何反應。

      void setPanel(String str){ 
          CardLayout layout = (CardLayout)jPanel1.getLayout(); 
          if("runserver".equals(str)){ 
           layout.show(jPanel1, "card4"); 
      
          }else if("connectserver".equals(str)){ 
           layout.show(jPanel1, "card3"); 
      
          } else{ 
           layout.show(jPanel1, "card2"); 
          } 
      } 
      

How to Use CardLayout更多細節,看到了API更多的方法。


UPDATE

試運行這個例子,並與您的代碼檢查,看看是否你發現任何幫助

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestCardLayout { 

    PanelOne p1 = new PanelOne(); 
    PanelTwo p2 = new PanelTwo(); 
    PanelThree p3 = new PanelThree(); 

    CardLayout layout = new CardLayout(); 
    JPanel cardPanel = new JPanel(layout); 

    public TestCardLayout() { 
     JButton showOne = new JButton("Show One"); 
     JButton showTwo = new JButton("Show Two"); 
     JButton showThree = new JButton("Show Trree"); 
     JPanel buttonsPanel = new JPanel(); 
     buttonsPanel.add(showOne); 
     buttonsPanel.add(showTwo); 
     buttonsPanel.add(showThree); 
     showOne.addActionListener(new ButtonListener()); 
     showTwo.addActionListener(new ButtonListener()); 
     showThree.addActionListener(new ButtonListener()); 

     cardPanel.add(p1, "panel 1"); 
     cardPanel.add(p2, "panel 2"); 
     cardPanel.add(p3, "panel 3"); 

     JFrame frame = new JFrame("Test Card"); 
     frame.add(cardPanel); 
     frame.add(buttonsPanel, BorderLayout.SOUTH); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private class ButtonListener implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
      String command = e.getActionCommand(); 
      if ("Show One".equals(command)) { 
       layout.show(cardPanel, "panel 1"); 
      } else if ("Show Two".equals(command)) { 
       layout.show(cardPanel, "panel 2"); 
      } else { 
       layout.show(cardPanel, "panel 3"); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       TestCardLayout testCardLayout = new TestCardLayout(); 
      } 
     }); 
    } 
} 

class PanelOne extends JPanel { 

    public PanelOne() { 
     setBackground(Color.GREEN); 
     add(new JLabel("Panel one")); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 300); 
    } 
} 

class PanelTwo extends JPanel { 

    public PanelTwo() { 
     setBackground(Color.BLUE); 
     add(new JLabel("Panel two")); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 300); 
    } 
} 

class PanelThree extends JPanel { 

    public PanelThree() { 
     setBackground(Color.YELLOW); 
     add(new JLabel("Panel three")); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 300); 
    } 
} 

更新2

Th問題是,該按鈕在ConfigurePanel類中。試圖在該類中創建新的StartUPGUI,將不會引用相同的組件。您需要做的是將StartUPGUI的參考文件傳遞給ConfigurePanel。事情是這樣的

public class ConfigurePanel extends JPanel { 
     StartUPGUI startup; 

     public ConfigurePanel(StartUPGUI startup) { 
      this.startup = startup; 
     } 

     .... 
     public void actionPerformed(ActionEvent e) { 
      startup.setPanel("runserver"); 

     } 
    } 

和實例ConfigurePanelStartUPGUI這樣

new ConfigurePanel(StartUPGUI.this); 
+0

好吧,它沒有崩潰或拋出異常。但沒有發生。我試過** layout.show(jPanel1,「card4」); **。這是否意味着(runServer,「card4」)組件不存在?爲什麼會這樣 – ragingbull

+0

其中_exactly_是來自帖子的第二個代碼塊的代碼?我的意思是它存在於你的程序代碼中?我擁有的代碼應該始終工作,因爲您正確地使用它的方式和上下文。 –

+0

我在代碼中看到'.jPanel1.add(runServer,「card」)',所以它存在。 –