Java 如何在cardlayout中显示其他类的面板?
我创建了这个简单的程序。我的问题是,我想在不打开新JFrame的情况下显示其他类的面板。但我无法创造任何解决方案。是否有人可以编写简单的代码来显示如何访问其他类的面板并替换当前面板Java 如何在cardlayout中显示其他类的面板?,java,swing,oop,cardlayout,Java,Swing,Oop,Cardlayout,我创建了这个简单的程序。我的问题是,我想在不打开新JFrame的情况下显示其他类的面板。但我无法创造任何解决方案。是否有人可以编写简单的代码来显示如何访问其他类的面板并替换当前面板 package cardlayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.
package cardlayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Clayou {
private JFrame jf = new JFrame("card layout");
private JPanel jp = new JPanel();
private JPanel jp1 = new JPanel();
private JPanel jp2 = new JPanel();
private JButton jb1 = new JButton("second");
private JButton jb2 = new JButton("first");
private CardLayout cl = new CardLayout();
Clayou() {
jp.setLayout(cl);
jp1.add(jb1);
jp2.add(jb2);
jp1.setBackground(Color.black);
jp2.setBackground(Color.white);
jp.add(jp1, "1");
jp.add(jp2, "2");
cl.show(jp, "1");
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cl.show(jp, "2");
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cl.show(jp, "1");
}
});
jf.add(jp);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Clayou();
}
});
}
}
我刚刚回答了一个问题,这个问题的答案可能与此相同。我想这对你也有帮助。您可以扩展类别卡,以允许更多的卡类型。我为这个例子制作了两种卡片类型 进口
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.util.Vector;
主类
public class Gui extends JFrame implements ListSelectionListener {
Vector<String> menuList = new Vector<>();
JList<String> menu = new JList<>(menuList);
JPanel content = new JPanel(new CardLayout());
Gui(){
//put menu on left, content in middle
add(menu, BorderLayout.WEST);
add(content, BorderLayout.CENTER);
menu.addListSelectionListener(this);
//add multiple cards
addCard(new SimpleLabelCard("First Item", "First Item Text"));
addCard(new SimpleLabelCard("Second Item", "Second Item Text"));
addCard(new SimpleTextAreaCard("Third Item", "Third Item Text"));
//set content to first item
((CardLayout) content.getLayout()).show(content, "First Item");
}
private void addCard(Card c){
menuList.add(c.name);
content.add(c, c.name);
}
public static void main(String [] args){
Gui gui = new Gui();
gui.setSize(600, 500);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setVisible(true);
}
@Override
public void valueChanged(ListSelectionEvent e) {
if(e.getValueIsAdjusting()) return;
//set card layout from JList menu
((CardLayout) content.getLayout()).show(content, menu.getSelectedValue());
}
}
现在,如果您想制作另一种类型的卡,只需扩展卡类。我希望这是直截了当的。这实际上是我的一次学习经历。我不知道你的意思是什么?那么一个带有检索面板方法的接口呢<代码>公共接口HasPanel{Component getPanel();}我还是不擅长OOP,所以我不明白你说的这个程序在这个类中有两个面板,当按下相应的按钮时,一个面板替换另一个,我想在另一个类中创建一个面板,并用那个面板替换这些面板但是没有创建新的JFrame。我希望你能回答我的问题,你能简化我的理解吗:)只要看看我的代码,我会非常感谢你能先运行它,如果你需要额外的帮助,我会帮助你。确保它是您想要的。您的程序有两个面板,一个是固定的,即左边的按钮,第二个是按按钮更改的。。。。。我想用新面板完全替换它们,新面板应该在不同的类中。非常感谢您的帮助,我不得不使用此方法[card.next(您的面板);]
//Card.java
//this is the basic card class the extends JPanel
//it contains the name so you can easily switch to it
public class Card extends JPanel{
public final String name;
public Card(String name){
this.name = name;
}
}
//SimpleLabelCard.java
//extends Card, so it is also a JPanel
public class SimpleLabelCard extends Card{
private JLabel label = new JLabel();
public SimpleLabelCard(String name, String text) {
super(name);
label.setText(text);
add(label);
}
}
//SimpleTextAreaCard.java
public class SimpleTextAreaCard extends Card{
private JTextArea text = new JTextArea();
public SimpleTextAreaCard(String name, String text) {
super(name);
this.text.setText(text);
setLayout(new BorderLayout());
add(this.text, BorderLayout.CENTER);
}
}