我有一个从用户那里得到输入的应用程序;
它有8行JTextFields
,有3列:
+-----------+-----------+-----------+
| Field 1-1 | Field 1-2 | Field 1-3 |
+-----------+-----------+-----------+
| Field 2-1 | Field 2-2 | Field 2-3 |
+-----------+-----------+-----------+
| Field 3-1 | Field 3-2 | Field 3-3 |
+-----------+-----------+-----------+
在用户更改第一个或第二个字段的每一行中,必须在第三个字段中写入新值的总和
例如,当用户更改归档1-1&必须计算字段1-2的总和并在字段1-3中显示,依此类推其他行
我写了一个实现DocumentListener
的类,并命名为listenerClass
&在第1列和第1列中为.getDocument().addDocumentListener(new listenerClass)
的所有JTextFields
调用listenerClass
2;
现在在JTextField
我需要知道哪个listenerClass
调用了JTextField
才能确定必须添加哪些字段,并且必须在JTextField
中写入结果。
如何找出DocumentListener
{{1}}?{。}
有没有更好的方法来做到这一点?
谢谢
答案 0 :(得分:3)
这里有两个选项:
答案 1 :(得分:2)
在每个JTextField上放置一个带putClientProperty方法的属性。您可以将该属性用作id,并将其恢复到侦听器中。 例如:
JTextField 1_1 = new JTextField();
1_1.putClientProperty("id", "1_1");
编辑: 对不起,我忘记了你没有在监听器中引用源对象。所以最好也这样做:
JTextField 1_1 = new JTextField();
1_1.getDocument.putProperty("source", 1_1);
你可以在听众内部做到:
public void insertUpdate(DocumentEvent documentEvent) {
//source
Object source = documentEvent.getDocument().getProperty("source");
if (source instanceof JTextField){
JTextField field = (JTextField)source;
String id = field.getClientProperty("id");
}
}
几个月前我问了一个类似的问题:看看here。
答案 2 :(得分:2)
考虑使用JTable代替大量JTextFields or JFormattedTextFields并使用某些Listeners
进行聆听
来自代码
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class TableProcessing extends JFrame implements TableModelListener {
private static final long serialVersionUID = 1L;
private JTable table;
public TableProcessing() {
String[] columnNames = {"Item", "Quantity", "Price", "Cost"};
Object[][] data = {
{"Bread", new Integer(1), new Double(1.11), new Double(1.11)},
{"Milk", new Integer(1), new Double(2.22), new Double(2.22)},
{"Tea", new Integer(1), new Double(3.33), new Double(3.33)},
{"Cofee", new Integer(1), new Double(4.44), new Double(4.44)}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
model.addTableModelListener(this);
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public boolean isCellEditable(int row, int column) {
int modelColumn = convertColumnIndexToModel(column);
return (modelColumn == 3) ? false : true;
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.add(scrollPane);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
@Override
public void tableChanged(TableModelEvent e) {
System.out.println(e.getSource());
if (e.getType() == TableModelEvent.UPDATE) {
int row = e.getFirstRow();
int column = e.getColumn();
if (column == 1 || column == 2) {
TableModel model = table.getModel();
int quantity = ((Integer) model.getValueAt(row, 1)).intValue();
double price = ((Double) model.getValueAt(row, 2)).doubleValue();
Double value = new Double(quantity * price);
model.setValueAt(value, row, 3);
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableProcessing frame = new TableProcessing();
}
});
}
}
答案 3 :(得分:1)
使用yourTextField.setName("Alice")
,然后在DocumentListener实现中使用getName()
检索名称并检查“Alice”。
这些方法属于java.awt.Component
类。每个摆动JComponent都从它延伸。