2015-07-04 34 views
0

我想寫一個簡單的計數器程序,創建一個窗口與增加/減少按鈕來添加/減去一個數字。我的問題是,該程序只能在一次點擊後運作。我試圖讓它在多次點擊後保持運作。爲什麼動作偵聽器會阻止多次點擊?爲什麼Action Listener會阻止我的程序連續遞增/遞減數字?

實施例:

用戶類型5.點擊 '+' 按鈕。結果顯示6.
如果用戶再次單擊,則不會發生任何事情。

所需功能:

用戶類型5.點擊'+'按鈕5次。結果應該顯示10

import javax.swing.JFrame; 
import java.util.Scanner; 
import java.io.FileReader; 
import java.io.FileNotFoundException; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.IOException; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.event.KeyEvent; 
import java.net.URL; 
import javax.swing.AbstractButton; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.lang.*; 

public class CounterTestDemo4 extends JFrame 
{ 
// Create Buttons and fields 
private JButton jbtAdd = new JButton("+"); 
private JButton jbtSub = new JButton("-"); 
private JTextField jtfNumber1 = new JTextField(8); 
private JTextField jtfResponse = new JTextField(8); 

public static void main(String[] args) 
{ 

    JFrame frame = new CounterTestDemo4(); 
    frame.setTitle("Counter Test"); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
} 


public CounterTestDemo4() 
{ 
    //Create Panel 
    JPanel panel = new JPanel(); 
    panel.add(new JLabel("Enter Number:")); 
    panel.add(jtfNumber1); 
    panel.add(new JLabel("Result:")); 
    panel.add(jtfResponse); 
    panel.add(jbtAdd); 
    panel.add(jbtSub); 
    add(panel); 
    BtnListener listener = new BtnListener(); 
    jbtAdd.addActionListener(listener); 
    jbtSub.addActionListener(listener); 
} 

class JtfListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    int x = Integer.parseInt(jtfNumber1.getText()); 
    } 
} 

class BtnListener implements ActionListener 
{ 
    @Override 
public void actionPerformed(ActionEvent e) 
    { 
int int1 = Integer.parseInt(jtfNumber1.getText()); 
if(e.getSource().equals(jbtAdd)) 
    { 
    int1++; 
    jtfResponse.setText(String.valueOf(int1)); 
    } 

else if(e.getSource().equals(jbtSub)) 
{ 
    int1--; 
    jtfResponse.setText(String.valueOf(int1)); 
//end if 
}//end else if statement 
}//end action performed 
}//end BtnListner  
}//end CounterTestDemo4 

回答

2

你從一個JTextField中獲得的數量和改變對方,但你永遠不會得到的號碼已變更。建議:不要從ActionListener中的任何JTextField獲取數字。相反,創建一個int變量並將數字存儲在該變量中。只能使用文本字段進行顯示。唯一的例外是我想如果你想從JTextField中設置數字,然後在該偵聽器中設置int字段,但在此之後,使用int字段。

然後擺脫jtfResponse的:

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.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class CounterTestDemo4 extends JFrame { 
    private JButton jbtAdd = new JButton("+"); 
    private JButton jbtSub = new JButton("-"); 
    private JTextField jtfNumber1 = new JTextField(8); 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      JFrame frame = new CounterTestDemo4(); 
      frame.setTitle("Counter Test"); 
      frame.setLocationRelativeTo(null); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.pack(); 
      frame.setVisible(true); 
     } 
     }); 

    } 

    public CounterTestDemo4() { 
     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Enter Number:")); 
     panel.add(jtfNumber1); 
     panel.add(new JLabel("Result:")); 
     panel.add(jbtAdd); 
     panel.add(jbtSub); 
     add(panel); 
     BtnListener listener = new BtnListener(); 
     jbtAdd.addActionListener(listener); 
     jbtSub.addActionListener(listener); 
    } 

    class BtnListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     int int1; 
     try { 
      int1 = Integer.parseInt(jtfNumber1.getText()); 
      if (e.getSource().equals(jbtAdd)) { 
       int1++; 
       jtfNumber1.setText(String.valueOf(int1)); 
      } 

      else if (e.getSource().equals(jbtSub)) { 
       int1--; 
       jtfNumber1.setText(String.valueOf(int1)); 
      } 
     } catch (NumberFormatException e1) { 
      JOptionPane.showMessageDialog(jtfNumber1, 
        "Please enter a number in the text field", 
        "Text Field Without Number", JOptionPane.ERROR_MESSAGE); 
      jtfNumber1.selectAll(); 
      jtfNumber1.requestFocusInWindow(); 
     } 
     } 
    } 
} 
+0

你的例外是正確的,我的目的是,「集從一個JTextField的數量,」但我沒有與設置的偵聽器內的int字段一行代碼:'int x = Integer.parseInt(jtfNumber1.getText());' ? –

+0

@RaoulDuke:然後擺脫jtfResponse。請參閱編輯 –

+0

請注意我的低級編程技巧!謝謝你,這非常有幫助! –