java CardLayout不会切换回第一个面板
我做了一个简单的程序,几乎所有的东西都能用,除了第一个面板的背面开关。 所以,如果我点击“Druck”按钮,它会将资金从一个银行账户转移到另一个银行账户,然后它会切换到第二个面板,显示两个账户的余额,第二个面板上还有一个按钮,它应该注意切换回第一个面板,但当点击它时,什么都不会发生。还有另外两个类,“Bank”和“Customer”,但我没有粘贴代码,因为我认为这是不必要的。我的英语不是最好的,所以如果我不清楚,请告诉我! 提前谢谢
public class View extends JFrame {
private Container c;
private JPanel oben, unten, firstPanel, secondPanel;
private JLabel kontoInhaber, empfanger, bildBehalter, secondJLabel;
private JTextField jtextKontoinhaber, jtextempfanger, menge;
private JButton button, backButton;
private ImageIcon image;
private CardLayout cl;
public View (Bank bank){
c = getContentPane();
cl = new CardLayout();
oben = new JPanel();
unten = new JPanel();
firstPanel = new JPanel();
secondPanel = new JPanel();
kontoInhaber = new JLabel("Sender");
empfanger = new JLabel("Empfanger");
secondJLabel = new JLabel();
image = new ImageIcon("/Users/jetser/Desktop/ProgramozasKepek/bank.jpg");
bildBehalter = new JLabel(image);
jtextKontoinhaber = new JTextField(10);
jtextempfanger = new JTextField(10);
menge = new JTextField(10);
button = new JButton("Druck");
button.setActionCommand("uberweisen");
backButton = new JButton("Back");
backButton.setActionCommand("back");
//------------HOZZAADNI A DOLGOKAT-------------//
oben.add(bildBehalter);
oben.setBackground(Color.PINK);
unten.setLayout(new GridLayout(3,2));
unten.add(kontoInhaber);
unten.add(jtextKontoinhaber);
unten.add(empfanger);
unten.add(jtextempfanger);
unten.add(button);
unten.add(menge);
unten.setBackground(Color.PINK);
firstPanel.setLayout(new BoxLayout(firstPanel,BoxLayout.Y_AXIS));
firstPanel.add(oben);
firstPanel.add(unten);
secondPanel.add(secondJLabel);
secondPanel.add(backButton);
c.setLayout(cl);
c.add(firstPanel,"1");
c.add(secondPanel,"2");
cl.show(c,"1");
ButtonListener listener = new ButtonListener(bank,jtextKontoinhaber,jtextempfanger,menge,secondJLabel,c);
button.addActionListener(listener);
}}
public class ButtonListener implements ActionListener {
private Bank bank;
private JTextField einhalter, empfanger, geldMenge;
private JLabel secondLabel;
private Container c;
public ButtonListener(Bank bank, JTextField einhalter, JTextField empfanger, JTextField geldMenge, JLabel secondLabel, Container c) {
this.bank = bank;
this.einhalter = einhalter;
this.empfanger = empfanger;
this.geldMenge = geldMenge;
this.secondLabel = secondLabel;
this.c = c;
}
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout) (c.getLayout());
if(e.getActionCommand().equals("uberweisen")){
cl.show(c,"2");
for(int i=0; i<bank.getKunden().length; i++){
if(einhalter.getText().equals(bank.getKunden()[i].getName())){
for(int j=0; j<bank.getKunden().length; j++){
if(empfanger.getText().equals(bank.getKunden()[j].getName())){
String geld = geldMenge.getText();
double geldMenge = Double.valueOf(geld);
bank.getKunden()[i].geldUberweisen(geldMenge);
bank.getKunden()[j].geldErhalten(geldMenge);
String output = bank.getKunden()[i].getName() + ": " + bank.getKunden()[i].getKontostand() + "\n" +
bank.getKunden()[j].getName() + ": " + bank.getKunden()[j].getKontostand();
secondLabel.setText(output);
System.out.println(output);
}
}
}
}
}
else if(e.getActionCommand().equals("back")) {
cl.show(c,"1");
}
}}
# 1 楼答案
我重新创建了您的GUI,并修复了
CardLayout
的问题以下是我想强调的要点
必须始终通过调用
SwingUtilities
invokeLater
方法来启动Swing应用程序。此方法确保在Event Dispatch Thread(EDT)上创建和执行Swing组件我将
JFrame
、CardLayout
、FirstPanel
和SecondPanel
在它们自己的类中的创建分开。这样,我可以一次只关注GUI的一部分当我创建
FirstPanel
类时,我按行、列顺序创建了Swing组件。我还将与一个Swing组件相关的所有方法调用放在一起。这使得测试和调试变得更加容易总之,这是我运行的代码。您需要在action listener中添加不重要的
Bank
和Customer
信息通过调用
CardLayoutPanel
类和FirstPanel
类中的适当方法,可以从FirstPanel
访问JTextField
。这样,我只需将一个实例传递给ButtonListener
类