2016-04-11 16 views
0

Bir actionPerformed sahibiyim ve eğer/else, kullanıcı "A" tuşuna basarsa, metni farklı bir şeye ayarlayacaktır. "A" düğmesine bastıktan sonra metni ayarlamak yerine, program metni ayarlamayı atlar ve aşağıdaki if ifadesine geçer. Benim sorum, programımı metnimi if ifademden önce nasıl ayarlayabilirim? Kodum aşağıda, teşekkürler!Eylem metnin değiştirilmemesine neden oldu

import javax.swing.*; 
import java.awt.*; 
import java.io.*; 
import java.util.*; 
import java.awt.event.*; 

public class ATMProject extends JPanel implements ActionListener { 
    private JPanel mainPanel = null; 
    private JPanel btnPanel = null; 
    private JPanel userBtns = null; 
    private JTextArea textArea = null; 
    private JPanel keyPanel = null; 
    private JTextField numField = null; 
    private JPanel numpadPanel = null; 
    private JButton[] userButtons = null; 
    private JButton[] keypadButtons = null; 
    private String[] btnPanelbtns = { "A", "B", "C" }; 
    private String[] numpadPanelbtns = { "7", "8", "9", "4", "5", "6", "1", "2", "3", "0", ".", "CE" }; 
    private boolean isuserButtonPressed = false; 
    private boolean isAccEntered = true; 
    private FileReader file = null; 
    private String custAcc; 
    private String custPin; 
    private String userInputAcc; 
    private String userInputPin; 

    public ATMProject() { 
     super(); 
     mainPanel = new JPanel(); 
     this.setLayout(new BorderLayout()); 
     this.add(mainPanel); 

     btnPanel = new JPanel(); 
     btnPanel.setLayout(new GridLayout(3, 1)); 
     this.add(btnPanel, BorderLayout.EAST); 

     textArea = new JTextArea(); 
     this.add(textArea, BorderLayout.CENTER); 

     keyPanel = new JPanel(); 
     keyPanel.setLayout(new BorderLayout()); 
     this.add(keyPanel, BorderLayout.WEST); 

     numpadPanel = new JPanel(); 
     numpadPanel.setLayout(new GridLayout(4, 3)); 
     keyPanel.add(numpadPanel, BorderLayout.CENTER); 

     numField = new JTextField(); 
     keyPanel.add(numField, BorderLayout.NORTH); 

     userButtons = new JButton[btnPanelbtns.length]; 
     for (int i = 0; i < userButtons.length; i++) { 
      userButtons[i] = new JButton(btnPanelbtns[i]); 
      userButtons[i].addActionListener(this); 
      btnPanel.add(userButtons[i]); 
     } 

     keypadButtons = new JButton[numpadPanelbtns.length]; 
     for (int i = 0; i < numpadPanelbtns.length; i++) { 
      keypadButtons[i] = new JButton(numpadPanelbtns[i]); 
      keypadButtons[i].addActionListener(this); 
      numpadPanel.add(keypadButtons[i]); 
     } 

     textArea.setText("Enter customer number: --> \nPress A when done \nA = OK"); 
     userInputAcc = numField.getText(); 

     // reading 
     try { 
      file = new FileReader("ConfidentialCustInfo.txt"); 
      Scanner input = new Scanner(file); 
      custAcc = input.next(); 
      custPin = input.next(); 
      System.out.println(custAcc); 
      System.out.println(custPin); 
      input.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     if (e.getActionCommand().equals("CE")) { 
      numField.setText(""); 
     } else if (e.getActionCommand().equals("1")) { 
      numField.setText(numField.getText() + "1"); 
     } else if (e.getActionCommand().equals("2")) { 
      numField.setText(numField.getText() + "2"); 
     } else if (e.getActionCommand().equals("3")) { 
      numField.setText(numField.getText() + "3"); 
     } else if (e.getActionCommand().equals("4")) { 
      numField.setText(numField.getText() + "4"); 
     } else if (e.getActionCommand().equals("5")) { 
      numField.setText(numField.getText() + "5"); 
     } else if (e.getActionCommand().equals("6")) { 
      numField.setText(numField.getText() + "6"); 
     } else if (e.getActionCommand().equals("7")) { 
      numField.setText(numField.getText() + "7"); 
     } else if (e.getActionCommand().equals("8")) { 
      numField.setText(numField.getText() + "8"); 
     } else if (e.getActionCommand().equals("9")) { 
      numField.setText(numField.getText() + "9"); 
     } else if (e.getActionCommand().equals("A")) { 
      if (numField.getText().isEmpty()) { 
       textArea.setText("error"); 
      } else { 
       numField.setText(""); 
       textArea.setText("Enter PIN: \n A = OK"); 
       userInputPin = (numField.getText()); 

      } 
     } 
    } 

    public static void main(String[] args) { 
     MyFrame mf = new MyFrame(); 
    } 

} 
+0

Genellikle, bilgi için kullanıcıdan bilgi almak için bir JOptionPane kullanırsınız. Daha fazla bilgi ve örnek için Swing öğreticisinden [Dialog Make To Make Dialog] (http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html) bölümündeki bölümü okuyun. Bir dinleyicide yuvalanmış if/else ifadeleri kullanmayın. Her düğmenin kendi dinleyicisi olmalıdır. Yaygın işlevselliğe sahip düğmeler dinleyiciyi paylaşabilir (yani sayısal tuş). Bu yaklaşımın bir örneği için http://stackoverflow.com/questions/23375276/attaching-a-single-action-listener-to-all-buttons/23375436#23375436 adresine bakın. – camickr

cevap

2

Sen programı bir devlet değişkeni, bu üzerinde ne devlet söylemek ve sonra dinleyici o durumuna bağlı olarak farklı tepki sağlayacak bir şeyler vermek gerekir.

Örneğin bunu bir boolean değişkeni veya değişkenler, ardından

private boolean enteringAcctNumber = true; 

ve böyle bir şey verebilir yerleştirmek bir bu boolean denetler ve uygun şekilde yanıt verir senin ActionListener blok. Örneğin

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class ATMProj2 extends JPanel { 
    private static final int COLS = 30; 
    private static final String ACCOUNT_PROMPT = "Enter Account Number"; 
    protected static final String ENTER_PIN = "Account number accepted. Enter PIN"; 
    protected static final String PIN_ACCEPTED = "PIN has been accepted. Have fun."; 
    private boolean enteringAcctNumber = true; 
    private JTextField textField = new JTextField(COLS); 
    private JTextArea textArea = new JTextArea(6, COLS); 
    private JButton okButton = new JButton("OK"); 

    public ATMProj2() { 
     textArea.setText(ACCOUNT_PROMPT); 
     textArea.setFocusable(false); // so user can't mess with it 
     okButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       // test state variable, and base behavior on its state 
       if (enteringAcctNumber) { 
        textArea.setText(ENTER_PIN); 
        textField.setText(""); 
        enteringAcctNumber = false; // ok now not entering account 
       } else { 
        textArea.setText(PIN_ACCEPTED); 
       } 
      } 
     }); 

     JPanel btnPanel = new JPanel(); 
     btnPanel.add(okButton); 

     setLayout(new BorderLayout()); 
     add(textField, BorderLayout.PAGE_START); 
     add(new JScrollPane(textArea), BorderLayout.CENTER); 
     add(btnPanel, BorderLayout.PAGE_END); 
    } 

    private static void createAndShowGui() { 
     ATMProj2 mainPanel = new ATMProj2(); 

     JFrame frame = new JFrame("ATMProj2"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 
+0

Temel olarak, bir hesap numarasının girildiğinden emin olmak için bir boole oluşturuyorum ve öyleyse metin ayarına devam edin. Ya da bir hata görüntüler. – Blastoize34

+0

@ Blastoize34: veya duruma bağlı olarak birkaç boolean var, ya da bir boole olmak zorunda değil. Genellikle eyalet alanlarına enumlar kullanırım. Cevaplamak için düzenlemeye bakın. –

+0

Boole ekledikten sonra bile, hala çalışmıyor. 'if (e.getActionCommand().eşittir ("A")) { \t \t \t halinde (isAccEntered) { \t \t \t \t textArea.setText (""); \t \t \t \t textArea.setText ("PIN girin: \ n A = OK"); \t \t \t \t userInputPin = numField.getText(); \t \t \t \t halinde (userInputPin.equals (custPin)) { \t \t \t \t \t textArea.setText ("BAŞARILI"); \t \t \t \t} başka { \t \t \t \t \t textArea.setText ("başarısız"); \t \t \t \t} \t \t \t} \t \t} ' – Blastoize34

2

Bu İçin

bir diğer kaydınızdan yorumdur: Anlıyorum

ben) (userInputAcc = numField.getText kullandığınızda; metni JTextField() 'dan almıyor. Ben userInputAcc için JTextArea metnini ayarlamak ve ekran karardı çünkü Tabii

textArea.setText("Enter customer number: --> \nPress A when done \nA = OK"); 
userInputAcc = numField.getText(); 

Eğer GUI oluştururken deyim yürütüldüğünde çünkü boştur> bu anladım ve kullanıcı değil sahiptir Metin alanında henüz bir şey yazma şansı vardı. Yukarıdaki ifade uygulandığında çerçeve görünmez.

Bu, doğrulanması kolay bir yöntemdir. Bu anda değişkenin değerini göstermek için temel hata ayıklama olan

userInputAcc = numField.getText(); 
System.out.println("(" + userINputAcc + ")"); 

değişkene bir değer atamak: Sadece için kodunuzu değiştirin.

Yalnızca bir olay oluşturulduğunda metin alanından metin alabilir ve etkinliği işlemek için kod yazabilirsiniz. Yani userInputAcc değişken her zaman boş olacaktır.

Ayrıca, kodunuz ActionListener'da neden çirkin iç içe geçmiş ifadesine sahiptir?

İlgili konular