以前的CardLayoutfunction不起作用?

我的cardlayout的下一个function是正常工作,但以前不是。 就我而言,只需要“layout.previous( _ );” 在我的makePanel()方法的actionPerformed方法体中应该可以工作,但是当我运行我的程序并单击prev按钮时,没有任何反应。 我究竟做错了什么? –

import java.awt.*; import javax.swing.*; import java.util.*; import java.awt.event.*; public class Temp { public static void main (String[] args) { new MakeAQuiz(); } static class MakeAQuiz { private JPanel start, base, fields, buttonz, question; private String [] labels = {"Enter your question: ", "Answer 1: ", "Answer 2: ", "Answer 3: ", "Answer 4: "}; private JButton [] buttons = {new JButton("<>")}; private JFrame makeFrame; public MakeAQuiz() { start = new JPanel(new CardLayout()); start.add(makePanel(),"1"); makeFrame = new JFrame(); makeFrame.setSize(500,600); makeFrame.add(start); makeFrame.setVisible(true); makeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public JFrame getJFrame() { return makeFrame; } public JPanel makePanel() { question = new JPanel(new FlowLayout()); fields = new JPanel(new GridBagLayout()); buttonz = new JPanel(new FlowLayout()); base = new JPanel(new BorderLayout()); GridBagConstraints c = new GridBagConstraints(); c.weighty=0.5; //adds padding between the fields vertically for (int i = 1; i<5; i++) { c.gridy++; //puts each field in a seperate line/row JLabel label = new JLabel(labels[i]); // c.fill = GridBagConstraints.HORIZONTAL; fields.add(label,c); JTextField textField = new JTextField(20); fields.add(textField,c); } final CardLayout layout = (CardLayout)start.getLayout(); buttons[1].addActionListener(new ActionListener() { // @Override public void actionPerformed(ActionEvent e) { buttons[0].setEnabled(false); buttons[2].setEnabled(false); // for(Component comp : cardPanel.getComponents()) { // if(comp instanceof Page) { // Page page = (Page)comp; // page.printData(); // } // } } }); buttons[2].addActionListener(new ActionListener() { // @Override public void actionPerformed(ActionEvent e) { start.add(makePanel(), String.valueOf(start.getComponentCount() + 1)); layout.next(start); } }); buttons[0].addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { layout.previous(start); } }); buttonz.add(buttons[0]); buttonz.add(buttons[1]); buttonz.add(buttons[2]); JLabel l = new JLabel(labels[0]); JTextField t = new JTextField(30); question.add(l); question.add(t); base.add(question,BorderLayout.NORTH); base.add(buttonz,BorderLayout.SOUTH); base.add(fields,BorderLayout.CENTER); return base; } } } 

一旦我在start面板中添加了一些额外的组件,我就没有问题(使用您的代码)。

但是,您会遇到问题,因为您已将按钮添加到CardLayout显示的面板上。

更好的解决方案是将按钮放在主屏幕的底部并将其与卡片分开。

您需要维护某种计数器或对当前页面的引用,因为CardLayout没有提供任何方法来获取对当前卡的引用。 这将允许您启用/禁用下一个/上一个按钮approritaly …

更新了runnable示例…

 import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; 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.JTextField; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class MakeAQuiz { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } new MakeAQuiz(); } }); } private JPanel start, base, fields, buttonz, question; private String[] labels = {"Enter your question: ", "Answer 1: ", "Answer 2: ", "Answer 3: ", "Answer 4: "}; private JButton[] buttons = {new JButton("<>")}; private JFrame makeFrame; public MakeAQuiz() { start = new JPanel(new CardLayout()); start.add(makePanel(), "1"); makeFrame = new JFrame(); makeFrame.add(start); buttonz = new JPanel(new FlowLayout()); final CardLayout layout = (CardLayout) start.getLayout(); buttons[1].addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { buttons[0].setEnabled(false); buttons[2].setEnabled(false); } }); buttons[2].addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int count = start.getComponentCount(); start.add(new JLabel(Integer.toString(count), JLabel.CENTER), Integer.toString(count)); layout.next(start); } }); buttons[0].addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { layout.previous(start); } }); buttonz.add(buttons[0]); buttonz.add(buttons[1]); buttonz.add(buttons[2]); makeFrame.add(buttonz, BorderLayout.SOUTH); makeFrame.pack(); makeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); makeFrame.setVisible(true); } public JFrame getJFrame() { return makeFrame; } public JPanel makePanel() { question = new JPanel(new FlowLayout()); fields = new JPanel(new GridBagLayout()); base = new JPanel(new BorderLayout()); GridBagConstraints c = new GridBagConstraints(); c.weighty = 0.5; //adds padding between the fields vertically for (int i = 1; i < 5; i++) { c.gridy++; //puts each field in a seperate line/row JLabel label = new JLabel(labels[i]); // c.fill = GridBagConstraints.HORIZONTAL; fields.add(label, c); JTextField textField = new JTextField(20); fields.add(textField, c); } JLabel l = new JLabel(labels[0]); JTextField t = new JTextField(30); question.add(l); question.add(t); base.add(question, BorderLayout.NORTH); base.add(fields, BorderLayout.CENTER); return base; } } 

不,我认为它不会那样工作。 只需单击上一个按钮就不会带回任何东西。 您应该将条目保存在其他位置,并在单击上一个按钮时将它们加载到相应的字段。