Прослушивание множества JTextFields и вычисление суммы значений в строке - PullRequest
2 голосов
/ 20 сентября 2011

У меня есть приложение, которое получает данные от пользователя;
оно имеет 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 и т. д. для других строк.
Iнаписал класс, который реализует DocumentListener и назвал его listenerClass и назвал .getDocument().addDocumentListener(new listenerClass) для всех JTextFields в столбце 1 & 2;
Теперь в listenerClass мне нужно знать, какой JTextField называется listenerClass, чтобы можно было определить, какие поля должны быть добавлены, и должен быть записан результат, в котором JTextField.

Как я могу узнать, какой JTextField называется DocumentListener?
Есть ли лучший способ сделать это?
Спасибо

Ответы [ 4 ]

3 голосов
/ 20 сентября 2011

У вас есть два варианта:

  • перебор: только один экземпляр слушателя, который вычислит 8 сумм и обновит 8 текстовых полей
  • smart: передайте конструктору класса слушателя 3 текстовых поля, а затем создайте экземпляр дифференцирующего слушателя для каждой строки
2 голосов
/ 20 сентября 2011

рассмотрите возможность использования JTable вместо множества JTextFields или JFormattedTextFields и прослушивания некоторыми из Прослушивателей

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();
            }
        });
    }
}
2 голосов
/ 20 сентября 2011

помещает свойство с методом putClientProperty для каждого JTextField. Вы можете использовать это свойство в качестве идентификатора и вернуть его обратно в слушатель. Например:

JTextField 1_1 = new JTextField();
1_1.putClientProperty("id", "1_1");

EDIT: Извините, я забыл, что у вас нет ссылки на исходный объект внутри слушателя. ТАК лучше так и сделай:

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");
         }
}

Я задавал похожий вопрос несколько месяцев назад: посмотрите здесь .

1 голос
/ 20 сентября 2011

Используйте yourTextField.setName("Alice"), затем в вашей реализации DocumentListener получите имя с помощью getName() и проверьте наличие "Алисы".

Эти методы принадлежат классу java.awt.Component.Каждый свинг JComponent простирается от него.

...