在 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 类
and my JFrame class
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."
不要将字符串与
==
进行比较,它不会起作用.使用.equals
..if("runserver".equals(str)){
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 newStartUPGUI
in that class, won't reference the same components. What you need to do is pass a reference of theStartUPGUI
to theConfigurePanel
. Something like thispublic class ConfigurePanel extends JPanel { StartUPGUI startup; public ConfigurePanel(StartUPGUI startup) { this.startup = startup; } .... public void actionPerformed(ActionEvent e) { startup.setPanel("runserver"); } }
并像这样从
StartUPGUI
实例化ConfigurePanel
And instantiate
ConfigurePanel
from theStartUPGUI
like thisnew ConfigurePanel(StartUPGUI.this);
相关文章