CardLayout - не вернется к первой панели - PullRequest
0 голосов
/ 07 мая 2020

Сделал простенькую программу, работает почти все, кроме обратного перехода на первую панель. Итак, если я нажму кнопку «Druck», он переведет деньги с банковского счета на другой банковский счет, затем он переключится на вторую панель, где отображается баланс обоих счетов, а также на второй панели кнопка, которая должна позаботиться о переключении обратно на первую панель, но при нажатии на нее ничего не происходит. Также есть два других класса: «Банк» и «Клиент», но я не вставлял код, потому что считаю, что в этом нет необходимости. Мой английский sh не самый лучший, поэтому, если я не понял, дайте мне знать! Заранее спасибо!

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 Ответ

0 голосов
/ 08 мая 2020

Я воссоздал ваш GUI и исправил проблему с CardLayout.

Вот основные моменты, которые я хочу подчеркнуть.

  1. Вы всегда должны запустите приложение Swing с помощью вызова метода SwingUtilities invokeLater. Этот метод обеспечивает создание и выполнение компонентов Swing в потоке отправки событий (EDT).

  2. Я разделил создание JFrame, CardLayout, FirstPanel и SecondPanel в своих классах. Таким образом, я мог сосредоточиться на одной части GUI за раз.

  3. Когда я создавал класс FirstPanel, я создавал компоненты Swing по строкам и столбцам. Я также объединил все вызовы методов, относящиеся к одному компоненту Swing. Это значительно упрощает тестирование и отладку.

В любом случае, вот код, который я запустил. Вам нужно будет добавить эту неважную информацию Bank и Customer в прослушиватель действий.

Вы можете получить доступ к JTextField из FirstPanel, вызвав соответствующие методы в CardLayoutPanel класс и класс FirstPanel. Таким образом, мне нужно было передать классу ButtonListener только один экземпляр.

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class SimpleBankProgram 
        implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(
                new SimpleBankProgram());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(
                JFrame.EXIT_ON_CLOSE);

        CardLayoutPanel panel = 
                new CardLayoutPanel();
        frame.add(panel.getPanel());

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public class CardLayoutPanel {

        private CardLayout cardLayout;

        private FirstPanel firstPanel;

        private JPanel panel;

        private SecondPanel secondPanel;

        public CardLayoutPanel() {
            createPartControl();
        }

        private void createPartControl() {
            panel = new JPanel();
            cardLayout = new CardLayout();
            panel.setLayout(cardLayout);

            firstPanel = new FirstPanel(this);
            panel.add(firstPanel.getPanel(), "1"); 

            secondPanel = new SecondPanel(this);
            panel.add(secondPanel.getPanel(), "2"); 

            showFirstPanel();
        }

        public void showFirstPanel() {
            cardLayout.show(panel, "1");
        }

        public void showSecondPanel() {
            cardLayout.show(panel, "2");
        }

        public JPanel getPanel() {
            return panel;
        }

        public FirstPanel getFirstPanel() {
            return firstPanel;
        }

        public SecondPanel getSecondPanel() {
            return secondPanel;
        }

    }

    public class FirstPanel {

        private JPanel panel;

        private JTextField jtextKontoinhaber;
        private JTextField jtextempfanger;
        private JTextField menge;

        public FirstPanel(CardLayoutPanel 
                cardLayoutPanel) {
            createPartControl(cardLayoutPanel);
        }

        private void createPartControl(CardLayoutPanel
                cardLayoutPanel) {
            panel = new JPanel();
            panel.setLayout(new BoxLayout(
                    panel, BoxLayout.Y_AXIS));

            JPanel oben = new JPanel();
            oben.setBackground(Color.PINK);

            // An image goes here
            JLabel bildBehalter = new JLabel(" ");
            oben.add(bildBehalter);

            JPanel unten = new JPanel();
            unten.setBackground(Color.PINK);
            unten.setLayout(new GridLayout(3,2));

            JLabel kontoInhaber = new JLabel("Sender");
            unten.add(kontoInhaber);

            jtextKontoinhaber = new JTextField(10);
            unten.add(jtextKontoinhaber);

            JLabel empfanger = new JLabel("Empfanger");
            unten.add(empfanger);

            jtextempfanger = new JTextField(10);
            unten.add(jtextempfanger);

            ButtonListener listener = 
                    new ButtonListener(cardLayoutPanel);

            JButton button = new JButton("Druck");
            button.setActionCommand("uberweisen");
            button.addActionListener(listener);
            unten.add(button);

            menge = new JTextField(10);
            unten.add(menge);

            panel.add(oben);
            panel.add(unten);
        }

        public JPanel getPanel() {
            return panel;
        }

        public JTextField getJtextKontoinhaber() {
            return jtextKontoinhaber;
        }

        public JTextField getJtextempfanger() {
            return jtextempfanger;
        }

        public JTextField getMenge() {
            return menge;
        }

    }

    public class SecondPanel {

        private JLabel secondJLabel;

        private JPanel panel;

        public SecondPanel(CardLayoutPanel 
                cardLayoutPanel) {
            createPartControl(cardLayoutPanel);
        }

        private void createPartControl(CardLayoutPanel 
                cardLayoutPanel) {
            panel = new JPanel();

            secondJLabel = new JLabel(" ");
            panel.add(secondJLabel);

            ButtonListener listener = 
                    new ButtonListener(cardLayoutPanel);

            JButton backButton = new JButton("Back");
            backButton.setActionCommand("back");
            backButton.addActionListener(listener);
            panel.add(backButton);

        }

        public JPanel getPanel() {
            return panel;
        }

        public void setJLabel(String text) {
            secondJLabel.setText(text);
        }
    }

    public class ButtonListener implements ActionListener {

        private CardLayoutPanel cardLayoutPanel;

        public ButtonListener(CardLayoutPanel 
                cardLayoutPanel) {
            this.cardLayoutPanel = cardLayoutPanel;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            if (event.getActionCommand()
                    .equals("uberweisen")) {
                String output = "Some bank text I "
                        + "can't duplicate";
                cardLayoutPanel.getSecondPanel()
                        .setJLabel(output);
                cardLayoutPanel.showSecondPanel();
            } else if (event.getActionCommand()
                    .equals("back")) {
                cardLayoutPanel.showFirstPanel();
            }
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...