我有一个名为 AddAccounts 的类
class AddAccounts extends JPanel {
JPanel panelCont; //Panel deck
CardLayout cl;
public AddAccounts() {
panelCont=new JPanel();
cl = new CardLayout();
panelCont.setLayout(cl);//set Panel Layout to CardLayout
setPreferredSize(new Dimension(1013, 513));//Set Default Size
/* Add Panels to the main window or integrate the panels*/
panelCont.add(new Panel1(), "1");
panelCont.add(new Panel2(),"2");
panelCont.add(new Panel3(),"3");
cl.show(panelCont, "1");
add(panelCont);
}
public void goNext() {
cl.show(panelCont, "2");
// cl.nxet(panelCont);
System.out.println("method called"); //for debugging purpose
}
public void showFirstPanel(){
cl.show(panelCont, "1");
}
}
还有两个名为Panel1 和 panel2() 的外部(单独文件)类。我想在 panel1 中按下按钮时更改卡片(从 panel1 到 panel2),这就是为什么我创建上面列出的名为 goNext() 的方法, 但问题是我无法更换卡。这是我如何尝试在 Panel1 中调用 goNext() 方法
@Override
public void actionPerformed(ActionEvent event) {
if (event.getSource() == nextBtn) {
setMainCategory((String)mainCat.getSelectedItem());
}
}
public void setMainCategory(String mainCategory){
this.mainCategory=mainCategory;
new AddAccounts().goNext();
//System.out.println("From set Method: "+this.mainCategory);
}
一切正常,System.out.println("方法调用");//出于调试目的被执行并打印在控制台窗口上,但面板(卡)不会改变。 请帮助..如何使其工作。
@haraldK
你说的完全正确。但这对我没有帮助,我试图实现的概念是我有一个名为 mainPanel 的 JFrame,在 mainPanel 中我有一个 JSplitPanel
JSplitPane rootPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, userPanel, mainContentPane);
mainContentPane 组成
JTabbedPane mainContentPane = new JTabbedPane();
mainContentPane.setPreferredSize(new Dimension(900, 550));
mainContentPane.setTabPlacement(JTabbedPane.TOP);
mainContentPane.addTab("您的数据库", new UserRecords());
mainContentPane.addTab("Add Accounts", new AddAccounts());//这里是AddAccounts JPanel
mainContentPane.addTab("更新现有数据", new EditRecords());
mainContentPane.setSelectedIndex(1);
我将按钮放置在Panel1、Panel2 上,而不是将按钮放置在父框架AddAccounts 上。这里的 goNext 方法属于 AddAccounts,当在 Panel1 中按下按钮时,我想访问它来更改面板(从 1 到 2)。我无法直接调用 goNext() 方法,因为它是 AddAccounts 类的方法而不是 Panel1。和 new AddAccounts().goNext();
没有帮助
目录结构:
我的包
-UserPanel(MainPanelFrame,userPanelJPanel,mainContentPaneTabbedPane)
-添加帐户(goNext())
-Panel1(下一个Btn)
-Panel2 (nextBtn)
最佳答案
问题不是 CardLayout
代码,而是 setMainCategory
方法:
new AddAccounts().goNext();
每次调用该方法时,您都会创建一个 AddAccounts
的新实例。面板在此实例上翻转(这就是您看到调试输出的原因),但组件从未添加到父级(如 JFrame
或 JPanel
),因此从未显示过。方法退出后,生成的组件将被丢弃。
相反,您需要向父组件添加一个 AddAccounts
,并且在 setMainCategory
方法中,只需调用 goNext()
在这个例子中。
这是一个功能齐全的程序,演示了我上面试图解释的所有内容:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class CardLayoutTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("CardLayoutTest");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new AddAccounts()); // Create single instance here
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
static class AddAccounts extends JPanel {
JPanel panelCont; //Panel deck
CardLayout cl;
public AddAccounts() {
panelCont = new JPanel();
cl = new CardLayout();
panelCont.setLayout(cl);//set Panel Layout to CardLayout
/* Add Panels to the main window or integrate the panels*/
panelCont.add(new ColorPanel(Color.ORANGE), "1");
panelCont.add(new ColorPanel(Color.GRAY), "2");
panelCont.add(new ColorPanel(Color.DARK_GRAY), "3");
cl.show(panelCont, "1");
add(panelCont);
add(new JButton(new AbstractAction("First") {
@Override
public void actionPerformed(ActionEvent e) {
showFirstPanel();
}
}));
add(new JButton(new AbstractAction("Next") {
@Override
public void actionPerformed(ActionEvent e) {
// This method is similar to your setMainCategory
goNext();
}
}));
}
public void goNext() {
// cl.show(panelCont, "2");
cl.next(panelCont); // Allows iterating through all panels
System.out.println("method called"); //for debugging purpose
}
public void showFirstPanel() {
cl.show(panelCont, "1");
}
/// Dummy class to show that page flipping works
private class ColorPanel extends JPanel {
public ColorPanel(Color background) {
setOpaque(true);
setBackground(background);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 200);
}
}
}
}
关于java - 无法更改 Java Swing CardLayout 中的卡片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37113581/