Выберите элемент jComboBox только один раз для добавления строки в jTable - PullRequest
0 голосов
/ 15 января 2019

Я добавляю выбранный элемент jCombobox в jTable, но хочу добавить элемент только один раз и изменить значения определенных ячеек.
Например: Я добавил товар для продажи, поэтому, когда я выбираю тот же товар еще раз, он должен соответственно увеличить количество и цену, чем при добавлении новой строки.
Я пытался использовать следующий код:

private void jComboBoxActionPerformed(java.awt.event.ActionEvent evt) {                                          
    DefaultTableModel df = (DefaultTableModel) jTable.getModel();
    String actionCommand = "comboBoxEdited";
    if (evt.getActionCommand().equals(actionCommand)) {
        Object items = jComboBox.getSelectedItem();
        String name = (String) items;
        String[] part = name.split("\t");
        String item = (part[0]);
        int qty = Integer.valueOf((part[1]));
        double price = Double.parseDouble((part[2]));
        int ids = Integer.valueOf(part[3]);

        int rows = df.getRowCount();
        df.addRow(new Object[]{part[0], part[1], part[2], part[3]});
        for (int i = 0; i < rows; i++) {
            String id = (String) jTable.getValueAt(i, 2);
            if (ids == Integer.valueOf((String) jTable.getValueAt(i, 3))) {
                int qt = qty+1;
                jTable.setValueAt(item, i, 0);
                jTable.setValueAt(qt, i, 1);
                jTable.setValueAt(price * qt, i, 2);
                jTable.setValueAt(ids, i, 3);
            } else {
                df.addRow(new Object[]{part[0], part[1], part[2], part[3]});
            }
        }
    }
}

Таким образом, с этим кодом я могу добавить только первую строку, а при добавлении еще одной я не могу получить желаемое поведение.

Вот мой полный код можно проверить непосредственно в IDE.
Большое вам спасибо.

1 Ответ

0 голосов
/ 17 января 2019

Посмотрите, работает ли нижеприведенная программа аналогично тому, что у вас на уме. Обратите внимание, как я использовал флаг found для построения логики.

(Я использовал «_» вместо символа табуляции, потому что он больше виден в поле со списком.)

Здесь я предположил, что «цена» в поле со списком не является ценой за единицу. Это цена полного количества в этом поле со списком.

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.BorderLayout;
import java.awt.event.*;

public class AddToTable {

  public static void main(String[] args) {

    JTable jTable = new JTable(new DefaultTableModel(
        new Object[][] {},
        new String[] {"Item", "Qty", "Price", "ID"}));

    JComboBox<String> jComboBox = new JComboBox<>();
    jComboBox.addItem("Item1 _ 2 _ 2.5 _ 101");
    jComboBox.addItem("Item2 _ 5 _ 6 _ 201");
    jComboBox.addItem("Item3 _ 3 _ 1.5 _ 301");

    jComboBox.addActionListener(new ActionListener()
    {
      @Override
      public void actionPerformed(ActionEvent e)
      {
        Object items = jComboBox.getSelectedItem();
        String name = (String) items;
        String[] part = name.split(" _ ");
        String item = (part[0]);
        Integer qty = Integer.valueOf((part[1]));
        Double price = Double.parseDouble((part[2]));
        Integer ids = Integer.valueOf(part[3]);

        DefaultTableModel df = (DefaultTableModel) jTable.getModel();
        int rows = df.getRowCount();
        boolean found = false;
        for (int i = 0; i < rows; i++) {
          if (ids.equals(jTable.getValueAt(i, 3))) {
            Integer newQty = qty + (Integer) jTable.getValueAt(i, 1);
            Double newPrice = price + (Double) jTable.getValueAt(i, 2);
            jTable.setValueAt(newQty, i, 1);
            jTable.setValueAt(newPrice , i, 2);
            found = true;
            break;
          }
        }
        if (!found) {
          df.addRow(new Object[]{item, qty, price, ids});
        }
      }
    });

    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.getContentPane().add(jComboBox, BorderLayout.NORTH);
    f.getContentPane().add(new JScrollPane(jTable), BorderLayout.CENTER);
    f.setBounds(300, 200, 400, 300);
    f.setVisible(true);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...