在此处输入图片说明我一直在从事个人项目,以使编程更好。我的目标是使其更加强大,我才刚刚开始。我目前是计算机
科学专业的学生。无论如何,我正在如图所示制作程序的一部分。我计算小时工资,并提供一些尚未执行的输出。我正在使用DocumentListener,它将自动进行计算。将文本从框中完全删除时出现错误,我尝试使用if语句修复它:
if (tipMon.equals("") || tipMon == null) {
tipMon.setText("0");
}
这是我到目前为止所拥有的。还没有完成,对于新手代码,我深表歉意。我从2个月前开始进行实际编码。
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JOptionPane;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import javax.swing.text.FieldView;
public class deliveryDocListener extends JFrame implements ActionListener,
DocumentListener{
private JLabel mon, tues, wed, thurs, fri, sat, sun, hourlyWage, blank, row2, monWage,
tuesWage,wedWage,thursWage, friWage, satWage, sunWage, total, totalTips, totalHours,
totalHourlyEarnings, totalPay, weekPay;
private JTextField hourlyWageInput, tipMon, tipTues, tipWed, tipThurs, tipFri, tipSat, tipSun,
hourMon, hourTues, hourWed, hourThurs, hourFri, hourSat, hourSun;
public deliveryDocListener(){
super("Delivery Helper v0.1 Alpha");
setLayout(new GridLayout(0,4));
hourlyWage = new JLabel("Hourly Wage: ");
add(hourlyWage);
hourlyWageInput = new JTextField("7.25", 5);
add(hourlyWageInput);
blank = new JLabel();
add(blank);
blank = new JLabel();
add(blank);
row2 = new JLabel("Day of the Week");
add(row2);
row2 = new JLabel("Tips");
add(row2);
row2 = new JLabel("Hours Worked");
add(row2);
row2 = new JLabel("Hourly Earnings");
add(row2);
mon = new JLabel("Monday");
add(mon);
tipMon = new JTextField("0");
Document tipMonListener = tipMon.getDocument();
//Document class doc variable stores what happens in the getDocument()
//method, getDocument() i think is what checked it real time we shall see
tipMonListener.addDocumentListener(this);
//add listener to he text field, this refers to most recent object (tipMon = new JTextField("0");"
//notice how its purple is the same as new where the object got made?
add(tipMon);
hourMon = new JTextField("0");
Document hourMonListener = hourMon.getDocument();
hourMonListener.addDocumentListener(this);
add(hourMon);
monWage = new JLabel("0");
add(monWage);
tues = new JLabel("Tuesday");
add(tues);
tipTues = new JTextField("0");
add(tipTues);
hourTues = new JTextField("0");
add(hourTues);
tuesWage = new JLabel("0");
add(tuesWage);
wed = new JLabel("Wednesday");
add(wed);
tipWed = new JTextField("0");
add(tipWed);
hourWed = new JTextField("0");
add(hourWed);
wedWage = new JLabel("0");
add(wedWage);
thurs = new JLabel("Thursday");
add(thurs);
tipThurs = new JTextField("0");
add(tipThurs);
hourThurs = new JTextField("0");
add(hourThurs);
thursWage = new JLabel("0");
add(thursWage);
fri = new JLabel("Friday");
add(fri);
tipFri = new JTextField("0");
add(tipFri);
hourFri = new JTextField("0");
add(hourFri);
friWage = new JLabel("0");
add(friWage);
sat = new JLabel("Saturday");
add(sat);
tipSat = new JTextField("0");
add(tipSat);
hourSat = new JTextField("0");
add(hourSat);
satWage = new JLabel("0");
add(satWage);
sun = new JLabel("Sunday");
add(sun);
tipSun = new JTextField("0");
add(tipSun);
hourSun = new JTextField("0");
add(hourSun);
sunWage = new JLabel("0");
add(sunWage);
blank = new JLabel();
add(blank);
blank = new JLabel();
add(blank);
blank = new JLabel();
add(blank);
blank = new JLabel();
add(blank);
total = new JLabel("Total: ");
add(total);
totalTips = new JLabel("totalTipsOutput");
add(totalTips);
totalHours = new JLabel("totalHoursOutput");
add(totalHours);
totalHourlyEarnings = new JLabel("totalHourlyEarningsOutput");
add(totalHourlyEarnings);
blank = new JLabel();
add(blank);
blank = new JLabel();
add(blank);
blank = new JLabel();
add(blank);
blank = new JLabel();
add(blank);
blank = new JLabel();
add(blank);
blank = new JLabel();
add(blank);
totalPay = new JLabel("Gross Income: ");
add(totalPay);
weekPay = new JLabel("totalPayOutput");
add(weekPay);
}
@Override
public void changedUpdate(DocumentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void insertUpdate(DocumentEvent e) {
//executes when someone enters text into input
String tipMonStr = tipMon.getText();
//monWage.setText(tipMonStr);
String hourMonStr = hourMon.getText();
double x = Double.parseDouble(tipMonStr);
double y = Double.parseDouble(hourMonStr);
double z = Double.parseDouble(hourlyWageInput.getText());
if (tipMonStr.length() == 0) {
tipMon.setText("0");
}
if (hourMonStr.length() == 0) {
y = 0;
hourMonStr = "0";
}
if (hourlyWageInput.getText().length() == 0) {
z = 0;
//String z = "0";
}
monWage.setText(Double.toString((z*y+x)/y));
//bug when nothing in cell because no number (0) to use in math
}
@Override
public void removeUpdate(DocumentEvent e) {
//executes when someone enters text into input
String tipMonStr = tipMon.getText();
//monWage.setText(tipMonStr);
String hourMonStr = hourMon.getText();
double x = Double.parseDouble(tipMonStr);
double y = Double.parseDouble(hourMonStr);
double z = Double.parseDouble(hourlyWageInput.getText());
monWage.setText(Double.toString((z*y+x)/y));
if (tipMon.equals("") || tipMon == null) {
tipMon.setText("0");
}
}
public void updateLog(DocumentEvent e, String action) {
monWage.setText(Double.toString(5));
}
@Override
public void actionPerformed(ActionEvent arg0) {
monWage.setText(Double.toString(5));
}
}
我将回答这个问题:我不会为此目的使用DocumentListener,因为在我看来这是用于该工作的错误工具。一方面,它
在用户仍在向JTextField 输入数据(尚未完成的数据)的同时不断地监听和更新结果。更好的方法是使用
添加到JButton或JTextFields中的ActionListener。
我想您可以使用FocusListener,但由于它是非常底层的,所以这也令我感到担忧。
另外:考虑使用InputVerifier验证您的输入。
另外:考虑在JTable中显示表格数据,其中第一列和第二列是可编辑的,而其他列则不可。
编辑
我不确定这是否符合要求,但是如果您从验证程序中进行计算,则可以使用。例如,为了一般性而更新:
import javax.swing.*;
/**
* @see http://stackoverflow.com/a/11818183/522444
*/
public class VerifierEg {
private static final String ZERO = "0.0";
private JTextField field1 = new JTextField(ZERO, 5);
private JTextField field2 = new JTextField(ZERO, 5);
private JTextField resultField = new JTextField(ZERO, 10);
private void createAndShowGui() {
resultField.setEditable(false);
resultField.setFocusable(false);
JPanel mainPanel = new JPanel();
final JTextField[] fields = {field1, field2};
mainPanel.add(field1);
mainPanel.add(new JLabel(" x "));
mainPanel.add(field2);
mainPanel.add(new JLabel(" = "));
mainPanel.add(resultField);
for (JTextField field : fields) {
field.setInputVerifier(new MyInputVerifier(field));
}
JFrame frame = new JFrame("VerifierEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private void calcProduct() {
double d1 = Double.parseDouble(field1.getText());
double d2 = Double.parseDouble(field2.getText());
double prod = d1 * d2;
resultField.setText(String.valueOf(prod));
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
VerifierEg eg = new VerifierEg();
eg.createAndShowGui();
}
});
}
/**
* @see http://stackoverflow.com/a/11818946/230513
*/
private class MyInputVerifier extends InputVerifier {
private JTextField field;
private double value;
public MyInputVerifier(JTextField field) {
this.field = field;
}
@Override
public boolean shouldYieldFocus(JComponent input) {
if (verify(input)) {
field.setText(String.valueOf(value));
calcProduct();
return true;
} else {
field.setText(ZERO);
field.selectAll();
return false;
}
}
@Override
public boolean verify(JComponent input) {
try {
value = Double.parseDouble(field.getText());
return true;
} catch (NumberFormatException e) {
return false;
}
}
}
}
这是我目前所掌握的。它还没有完成,我为noob代码道歉。我从两个月前开始实际编码。 }
问题内容: 传递0作为限制参数可以防止尾随空字符串,但是如何防止 前导 空字符串呢? 例如 结果是带有“”,“ Test”,“ Stuff”的数组。 是的,我知道我可以滚动自己的令牌生成器…但是StringTokenizer的API文档说 “ StringTokenizer是一个遗留类,出于兼容性原因保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人都使用拆分” 问题答案: 您最好的选择可能
如果我创建了一个简单的应用程序,其中有一个活动,其中包含一个EditText,我会这样做 这样可以防止键盘出现(在我的Android5.0和7.1测试中)。这就是我想要的,正如这些问题所要求的: 从EditText禁用软键盘,但仍允许复制/粘贴 如何为特定活动禁用Android软键盘 Android:在所有编辑文本中禁用软键盘 如何在编辑文本时禁用键盘弹出 禁用编辑文本上的键盘 源代码是 但是我看
问题内容: 我们在CMS上有一个ckeditor。我们的最终用户将通过该ckeditor输入一些长文章。我们需要一种方法来防止这些文章的连字符出现换行。 无论如何,是否可以防止所有浏览器上的连字符断行? 还是ckeditor可以选择防止这种情况? 问题答案: 恐怕没有比将文本分割成“单词”(由空格分隔的非空白字符序列)并包装每个在标记内包含连字符的“单词”更可靠的方法了。因此,输入数据将变为。 您
问题内容: 在这个问题中,我学习了如何防止插入NULL值。但是,不幸的是,无论如何都会插入一个空字符串。除了在PHP方面防止这种情况外,我想使用类似数据库约束的方法来防止这种情况。当然,有必要在应用程序方面进行检查,但是我希望双方都进行检查。 我被告知,无论应用程序在与您的数据库进行通信,它都不能在其中插入基本上错误的数据。所以… 仍将允许我执行此插入操作: 我想防止。 问题答案: 通常,您可以使
问题内容: 请看下面的简化示例: 这打印出来,但我希望所选的html部分照原样打印:。我如何告诉jsoup不要转换’<’符号? 问题答案: 可以使用jsoup。 使用jSoup 1.8.3,可以使用保留原始html的Parser.unescapeEntities方法。 在某些以前的版本中,不存在此方法。 从此链接了解更多信息。