2014-01-29 151 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”)',所以它存在。 –