2014-11-02 79 views
-1

我的程序在按下按钮时从多个文本字段中创建一个对象。但是,名为'nameField'的JTextField不能为空。如果'nameField'为空,那么我想打印一条错误信息,告诉用户文本框是空的。这段代码在我的actionPerformed函数的第一部分。检查JTextfield不为空

import javax.swing.*; 
import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class FuelStationInterface extends JFrame implements ActionListener { 

    private JLabel totalPriceLabel = new JLabel("Amount to pay = 0.00 GBP", SwingConstants.CENTER); 
    private JLabel totalItemsLabel = new JLabel("Items = 0", SwingConstants.CENTER); 
    private JPanel topPanel = new JPanel(); 

    private Container contentPane; 

    private double totalPrice = 0; 
    private int totalItems = 0; 

    private boolean breakSwitch = true; 
    private PurchaseVolume volumeNumber = null; 
    private PurchaseNumber unitNumber = null; 
    private int number = 0; 
    private int price = 0; 

    private String outputText = ""; 
    private JTextArea outputArea = new JTextArea(outputText); 
    private JTextArea errorReportField = new JTextArea(""); 

    private JPanel inputPanel = new JPanel(); 

    private JLabel nameLabel = new JLabel("Item Name"); 
    private JLabel numberLabel = new JLabel("Number of units (or Volume in L)"); 
    private JLabel priceLabel = new JLabel("Price per unit (or L) in pence"); 

    private JTextField nameField = new JTextField(10); 
    private JTextField numberField = new JTextField(10); 
    private JTextField priceField = new JTextField(10); 

    private JButton addVolumeButton = new JButton("Add by Volume"); 
    private JButton addNumberButton = new JButton("Add by number of units"); 

    public FuelStationInterface() { 
     super("Fuel station shop"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     outputArea.setEditable(false); 
     outputArea.setRows(30); 
     JScrollPane scrollPanel = new JScrollPane(outputArea); 
     scrollPanel.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     errorReportField.setEditable(false); 
     errorReportField.setRows(3); 

     addVolumeButton.addActionListener(this); 
     addNumberButton.addActionListener(this); 

     inputPanel.setLayout(new FlowLayout()); 
     inputPanel.add(nameLabel); 
     inputPanel.add(nameField); 
     inputPanel.add(numberLabel); 
     inputPanel.add(numberField); 
     inputPanel.add(priceLabel); 
     inputPanel.add(priceField); 
     inputPanel.add(addVolumeButton); 
     inputPanel.add(addNumberButton); 

     topPanel.setLayout(new GridLayout(0, 2)); 
     topPanel.add(totalPriceLabel); 
     topPanel.add(totalItemsLabel); 

     contentPane = getContentPane(); 
     contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); 
     contentPane.add(topPanel); 
     contentPane.add(scrollPanel); 
     contentPane.add(errorReportField); 
     contentPane.add(inputPanel); 

     pack(); 
     setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     while (breakSwitch = true) { 
      if (nameField.getText().isEmpty()) { 
       errorReportField.setText("name error"); 
       break; 
      } 
      try { 
       price = Integer.parseInt(priceField.getText()); 
      } catch (NumberFormatException exception) { 
       errorReportField.setText("price error"); 
       priceField.setText(""); 
       break; 
      } 
      try { 
       number = Integer.parseInt(numberField.getText()); 
      } catch (NumberFormatException exception) { 
       errorReportField.setText("number error"); 
       numberField.setText(""); 
       break; 
      } 
      if (e.getSource() == addVolumeButton) { 
       volumeNumber = new PurchaseVolume(nameField.getText(), number, price); 
       outputArea.append(volumeNumber.toString() + "\n"); 
       nameField.setText(""); 
       priceField.setText(""); 
       numberField.setText(""); 
       totalPrice += volumeNumber.getPrice() * volumeNumber.getVolume(); 
       totalItems += 1; 
       totalPriceLabel.setText("Amount to pay = " + Double.toString(totalPrice) + " GBP"); 
       totalItemsLabel.setText("Items = " + Integer.toString(totalItems)); 
      } 
      if (e.getSource() == addNumberButton) { 
       unitNumber = new PurchaseNumber(nameField.getText(), number, price); 
       outputArea.append(unitNumber.toString() + "\n"); 
       nameField.setText(""); 
       priceField.setText(""); 
       numberField.setText(""); 
       totalPrice += unitNumber.getPrice() * unitNumber.getNumber(); 
       totalItems += unitNumber.getNumber(); 
       totalPriceLabel.setText("Amount to pay = " + Double.toString(totalPrice) + " GBP"); 
       totalItemsLabel.setText("Items = " + Integer.toString(totalItems)); 
      } 
      errorReportField.setText(""); 
     } 
    } 

} 

按下按钮后,即使nameField文本字段输入了有效的字符串,也会出现空字符串错误,为什么?

+0

嗯,我不太了解你的问题,请你详细解释一下吗? – DreadHeadedDeveloper 2014-11-02 13:51:12

+0

因为,它看起来像是告诉代码在按下按钮后自行清空,然后问为什么它是空的.......... – DreadHeadedDeveloper 2014-11-02 13:53:19

+0

好多了,谢谢 – DreadHeadedDeveloper 2014-11-02 13:55:25

回答

2

你的问题是while循环的内容:

while (breakSwitch = true) { 
    if (nameField.getText().isEmpty()) { 
     errorReportField.setText("name error"); 
     break; 
    } 
    // stuff omitted 
    if (e.getSource() == addVolumeButton) { 
     // stuff omitted 
     nameField.setText(""); 
     // stuff omitted 
    } 
    if (e.getSource() == addNumberButton) { 
     // stuff omitted 
     nameField.setText(""); 
     // stuff omitted 
    } 
    errorReportField.setText(""); 
} 

首先:你已经创建了一个循环与分配,而不是一个布尔比较。 现在问题所在:如果e.getSource()addVolumeButtonaddNumberButton,那么您将删除nameField的内容。在循环的下一次迭代中,您正在测试是否nameField.getText().isEmpty(),它现在返回现在。你现在会得到错误并退出循环。

如何解决这个问题?我建议考虑这个循环,因为我相对确定,没有必要在那里循环。

actionPerformed方法不循环A版本看起来是这样的:

@Override 
public void actionPerformed(ActionEvent e) { 
    if (nameField.getText().isEmpty()) { 
     errorReportField.setText("name error"); 
     return; // error occured; exit the method early 
    } 
    try { 
     price = Integer.parseInt(priceField.getText()); 
    } catch (NumberFormatException exception) { 
     errorReportField.setText("price error"); 
     priceField.setText(""); 
     return; // error occured; exit the method early 
    } 
    try { 
     number = Integer.parseInt(numberField.getText()); 
    } catch (NumberFormatException exception) { 
     errorReportField.setText("number error"); 
     numberField.setText(""); 
     return; // error occured; exit the method early 
    } 
    if (e.getSource() == addVolumeButton) { 
     // omitted 
    } 
    if (e.getSource() == addNumberButton) { 
     // omitted 
    } 
    errorReportField.setText(""); 
} 

这个版本使用的码字return;如果发生错误,退出当前的方法。

+0

你确定吗?因为假设输入是正确的,break标签应该退出while循环,并且应该解决问题,因为循环只运行一次,然后中断并结束方法。假设在再次按下按钮之前输入新的插入点,所有事情都应该正常工作 – DreadHeadedDeveloper 2014-11-02 14:16:34

+0

虽然我同意,但如果您要在那里设置值,breakSwitch只是一个坏主意 – DreadHeadedDeveloper 2014-11-02 14:18:05

+0

不幸的是,使用while循环创建中断是唯一的方法如果其中一个字段不正确,我可以考虑停止创建对象 – user3371750 2014-11-02 14:20:18