聆听许多JTextField并计算行中的值和

时间:2011-09-20 10:44:07

标签: java swing jtextfield documentlistener

我有一个从用户那里得到输入的应用程序;
它有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}}?{。} 有没有更好的方法来做到这一点?
谢谢

4 个答案:

答案 0 :(得分:3)

这里有两个选项:

  • 暴力:只有一个将计算8个总和并更新8个文本字段的侦听器实例
  • smart:传递给你的监听器类构造函数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

进行聆听

enter image description here

来自代码

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都从它延伸。