首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >监听多个JTextFields并计算一行中的值总和

监听多个JTextFields并计算一行中的值总和
EN

Stack Overflow用户
提问于 2011-09-20 18:44:07
回答 4查看 1.8K关注 0票数 2

我有一个从用户那里获取输入的应用程序;

它有8行JTextFields,有3列:

代码语言:javascript
复制
+-----------+-----------+-----------+
| 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&2列中为所有JTextFields命名为.getDocument().addDocumentListener(new listenerClass)

现在在listenerClass中,我需要知道哪个JTextField调用了listenerClass,以便能够确定必须添加哪些字段,以及结果必须写入哪个JTextField

我怎样才能知道是哪个JTextField调用了DocumentListener

有没有更好的方法呢?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-20 18:55:17

这里有两个选项:

  • 暴力破解:只有一个侦听器实例将计算8个和并更新8个文本字段
  • smart:将3个文本字段传递给侦听器类构造函数,然后为每行

实例化一个不同的侦听器

票数 3
EN

Stack Overflow用户

发布于 2011-09-20 18:46:29

在每个JTextField上放置一个带有putClientProperty方法的属性。您可以将该属性用作id,并将其返回到侦听器中。例如:

代码语言:javascript
复制
JTextField 1_1 = new JTextField();
1_1.putClientProperty("id", "1_1");

编辑:对不起,我忘了你在监听器中没有对源对象的引用。所以最好也这样做:

代码语言:javascript
复制
JTextField 1_1 = new JTextField();
1_1.getDocument.putProperty("source", 1_1);

从监听程序内部,您可以执行以下操作:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-09-20 20:50:51

考虑使用JTable而不是大量的JTextFields or JFormattedTextFields,并由一些Listeners监听

来自代码

代码语言:javascript
复制
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();
            }
        });
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7483867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档