Próbuję rozwiązać projekt, ale utknąłem w problem.

• Program powinien wyświetlić menu, które pozwala użytkownikowi zrobić
Po operacjach (Uwaga: Użyj GUI):
1. Dodaj nowy klient
2. Usuń klienta
3. Modyfikuj informacje klienta // Ta opcja musi wyświetlić podmenu jako:
-------- 1. Indywidualny klient // Modyfikuj podstawowe informacje: Telefon # ...
Kod:

 //Modify Customer
    if (actionEvent.getSource().equals(modifyCustomer)) {
        frame.dispose();
        frame = new JFrame();
        panel = new JPanel();

        individualCustomer = new JButton("Individual customer");
        individualCustomer.addActionListener(this);

        panel.setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100));
        panel.setLayout(new GridLayout(0, 1));
        panel.add(individualCustomer);

        frame.setTitle("General Distribution Center");
        frame.add(panel, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

        //Individual Customer
        if (actionEvent.getSource().equals(individualCustomer)) {
            frame.dispose();
            System.out.println("Enter the new phone number: ");
            int updatedPhoneNumber = input.nextInt();
        }

Mój pierwszy problem brzmi: dlaczego następujące stwierdzenie jest fałszywe?

if (actionEvent.getSource().equals(individualCustomer)) {

Moim drugim problemem jest: Gdy stwierdzenie IF jest prawdziwe. Na przykład, jeśli wpiszę

if(true){
         frame.dispose();
         System.out.println("Enter the new phone number: ");
         int updatedPhoneNumber = input.nextInt();
     }

Uruchamia ten blok natychmiast po wybraniu opcji Modyfikuj opcję Klienta. Bez wyświetlania indywidualnej opcji / przycisku klienta, który tutaj stworzyłem:

        individualCustomer = new JButton("Individual customer");
        individualCustomer.addActionListener(this);

Proszę, jeśli nie znasz odpowiedzi i lepiej odpowiedź logicalnie na ten problem, podziel się nimi i będę pracować stamtąd.

0
Muath 21 marzec 2020, 02:52

1 odpowiedź

Najlepsza odpowiedź

Masz ogromny Action Listener, który próbuje zrobić zbyt wiele rzeczy naraz. Ta druga konstrukcja nigdy nie będzie prawdziwa ze względu na sposób, w jaki kod jest podłączony. Nagledowałeś, że jeśli jest taki, że jeśli jest zewnętrzny, jeśli jest prawdziwy (pozwala na osiągnięć wewnętrzny), wewnętrzny, jeśli będzie zawsze Bądź fałszywy:

if (actionEvent.getSource().equals(modifyCustomer)) {
    // if we're here, then source will **never** be individualCustomer

    //..... code here

    // the if-test below will **always** be false
    if (actionEvent.getSource().equals(individualCustomer)) {
         // .... code here
    }
}

Możesz uczynić tym, jeśli są serią:

if (actionEvent.getSource().equals(modifyCustomer)) {

    //.....

} else if (actionEvent.getSource().equals(individualCustomer)) {

    //.....

}

Potem będzie działać.

Lepiej nadać każdemu JBUTTON własny anonimowy wewnętrzny aktoryster do oddzielenia obaw

individualCustomer = new JButton("Individual customer");
individualCustomer.addActionListener(() -> {
    // button-specific listener code goes here
});

Odnośnie tego kodu:

if(true){
     frame.dispose();
     System.out.println("Enter the new phone number: ");
     int updatedPhoneNumber = input.nextInt();
}

Wygląda na to, że próbujesz wymieszać programowanie konsoli liniowej ze skanera i Println z GUI napędzanym zdarzeniem, a prawie zawsze gwarantuje się niepowodzeniem, ponieważ dwa paradygmaty nie mieszają się dobrze. Trzymaj się jednego paradygmatu, tutaj, trzymaj się, aby uzyskać wszystkie wejście przez GUI w sposób napędzany zdarzenie i usuń cały kod skanera na podstawie systemu.


Ostatnia rzecz, proszę spojrzeć na Wykorzystanie wielu JFRames, dobre / złe praktyki?

1
Hovercraft Full Of Eels 21 marzec 2020, 00:10