在JFrame中的JPanel之间切换 [英] Switching between JPanels in a JFrame

查看:123
本文介绍了在JFrame中的JPanel之间切换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

现在,我知道对此有很多很多问题,我已经读了很多.但是我只是碰壁,我不能做它的正面或反面.

Now I know there are many, many questions on this and I've read a dozen. But I've just hit a wall, I can't make heads or tails of it.

这里是我的问题.

我有3个小组课程.

ConfigurePanel.java
ConnectServerPanel.java
RunServerPanel.java

和我的JFrame类

StartUPGUI.java

这是在启动时初始化的内容

This is what is initialised at startup

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中调用setPanel方法

My StartUPGUI calls the StartUpPanel first. In my StartUpPanel.java I have a button which calls the setPanel method in StartUPGUI

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

这是我的setPanel方法

Here is my setPanel method

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

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

    }

    else{
    }
}

我需要在if块中放入哪些内容来更改面板视图?我本来以为jPanel1.something(),但我不知道那是什么.

What do I need to put inside the if blocks to change panel views? I would have assumed jPanel1.something() but I don't know what that something is.

推荐答案

我需要在if块中放入什么以更改面板视图?我本来假设jPanel1.something(),但我不知道那是什么."

"What do I need to put inside the if blocks to change panel views? I would have assumed jPanel1.something() but I don't know what that something is."

  1. 请勿将字符串与==进行比较,它将无法正常工作.使用.equals .. if("runserver".equals(str)){

  1. Don't compare string with ==, it will not work. Use .equals.. if("runserver".equals(str)){

您需要使用CardLayout

CardLayout.show(jPanel1, "whichPanel");

  • public void show(Container parent, String name)-使用addLayoutComponent翻转到使用指定名称添加到此布局的组件.如果不存在这样的组件,那么什么也不会发生.

    • public void show(Container parent, String name) - Flips to the component that was added to this layout with the specified name, using addLayoutComponent. If no such component exists, then nothing happens.

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


    • 请参见 如何使用CardLayout 有关更多详细信息,请参见 API 了解更多方法.


      See How to Use CardLayout for more details and see the API for more methods.

      更新

      尝试运行此示例,并通过代码进行检查,以查看是否发现有帮助的

      Try running this example and examine it with your code to see if you notice anything that will help

      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

      问题是,按钮在ConfigurePanel类中.试图在该类中创建一个新的StartUPGUI,将不会引用相同的组件.您需要做的是将StartUPGUI的引用传递给ConfigurePanel.像这样

      The problem is, the the button is in the ConfigurePanel class. Trying to create a new StartUPGUI in that class, won't reference the same components. What you need to do is pass a reference of the StartUPGUI to the ConfigurePanel. Something like this

          public class ConfigurePanel extends JPanel {
              StartUPGUI startup;
      
              public ConfigurePanel(StartUPGUI startup) {
                  this.startup = startup;
              }
      
              ....
              public void actionPerformed(ActionEvent e) {
                  startup.setPanel("runserver");
      
              }
          }
      

      像这样从StartUPGUI实例化ConfigurePanel

          new ConfigurePanel(StartUPGUI.this);
      

      这篇关于在JFrame中的JPanel之间切换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆