2014-01-29 3 views
0

Теперь я знаю, что на это много вопросов, и я прочитал дюжину. Но я просто ударил стену, я не могу сделать головы или хвосты.Переключение между JPanels в JFrame

Heres my question.

У меня 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 У меня есть кнопка, которая вызывает метод setPanel в StartUPGUI

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

Вот мой setPanel метод

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

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

    } 

    else{ 
    } 
} 

Что мне нужно поставить внутри, если блоки, чтобы изменить вид на панели? Я бы предположил jPanel1.something(), но я не знаю, что это такое.

+0

[Здесь] (http://docs.oracle.com/javase/7/docs/api/javax/swing/ JPanel.html) - это место, где вы можете прочитать все методы, которые вы можете использовать на JPanel. – csmckelvey

+0

Не сравнивайте строку с '==', это не сработает. Используйте '.equals' ..' if ("runningerver" .equals (str)) {' –

+0

Мне кажется, что я прошел через миллион своих методов. Am i на правильном пути с jPanel1.something()? – ragingbull

ответ

2

«Что мне нужно, чтобы поместить внутри блоков if, чтобы изменить вид панели? Я бы предположил jPanel1.something(), но я не знаю, что это такое».

  1. Не сравнить строку с ==, он не будет работать. Используйте .equals .. if("runserver".equals(str)){

  2. Вы должны использовать метод .show из CardLayout

    CardLayout.show(jPanel1, "whichPanel"); 
    
    • public void show(Container parent, String name) - переворачивается к компоненту, который был добавлен в этот макет с указанным именем, используя 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); 
    } 
} 

UPDATE 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"); 

     } 
    } 

И инстанцирует ConfigurePanel из StartUPGUI как этот

new ConfigurePanel(StartUPGUI.this); 
+0

Ну, это не сбой или исключение. Но ничего не случилось. Я попробовал ** layout.show (jPanel1, «card4»); **. Означает ли это, что компонент (runServer, "card4") не существует? Почему это должно быть – ragingbull

+0

Где _exactly_ - код второго блока кода вашего сообщения? Я имею в виду, где он существует в вашем программном коде? Код, который у меня есть, должен всегда работать, если вы используете его в правильном порядке и в контексте. –

+0

Я вижу '.jPanel1.add (runServer,« card »)' в вашем коде, поэтому он существует _does_. –

Смежные вопросы