Nano Hash - криптовалюты, майнинг, программирование

Почему в каждом поле JCombo в моей таблице отображается один и тот же список значений?

В обеих строках отображаются только самые последние значения comboBox.

ОБНОВЛЕНО Пример MVCE:

package main;
import java.awt.Color;
import java.awt.Font;
import java.util.ArrayList;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class SwingDemo {
   public static void main(String[] argv) throws Exception {
      DefaultTableModel model = new DefaultTableModel(); 
      model.addColumn("Column 1");
      JTable table = new JTable(model);
      Font font = new Font("Verdana", Font.PLAIN, 12);
      table.setFont(font);
      table.setRowHeight(30);
      table.setBackground(Color.orange);
      table.setForeground(Color.white);
      JFrame frame = new JFrame();
      frame.setSize(600, 400);
      frame.add(new JScrollPane(table));
      frame.setVisible(true);
      
      
      //add 1st row
     
      model.addRow("".split(""));
      TableColumn testColumn1stRow = table.getColumnModel().getColumn(0);
      JComboBox<String> comboBoxTest = new JComboBox<String>();
      ArrayList<String> testArray = new ArrayList<String>();
      testArray.add("one");
      testArray.add("two");
      testArray.add("three");
      for (int i = 0; i < testArray.size(); i++) {
          comboBoxTest.addItem(testArray.get(i));
      }
      testColumn1stRow.setCellEditor(new DefaultCellEditor(comboBoxTest));
      
      //add 2nd row
      model.addRow("".split(""));
      TableColumn testColumn2ndRow = table.getColumnModel().getColumn(0);
      JComboBox<String> comboBoxTest2 = new JComboBox<String>();
      ArrayList<String> testArray2 = new ArrayList<String>();
      testArray2.add("four");
      testArray2.add("five");
      testArray2.add("six");
      for (int i = 0; i < testArray2.size(); i++) {
          comboBoxTest2.addItem(testArray2.get(i));
      }
      testColumn2ndRow.setCellEditor(new DefaultCellEditor(comboBoxTest2));
   }
}

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

Любые идеи о том, как обойти это?

05.05.2021

  • Скорее всего, список, возвращаемый wpsListObj.getWps_list(), одинаков для всех ваших строк. Как вы создаете этот резервный список? 05.05.2021
  • @ Лино, это не так. Спасибо за ваш вклад. Я проверил это. Я думаю, это связано с тем, что TableColumn wpsColumn влияет на каждую строку, потому что он обрабатывает столбец в целом. Я просмотрю раскрывающийся список JComboBox, и он будет иметь правильные значения для этой строки, но когда я добавлю новую строку, которая должна иметь разные значения, все предыдущие строки теперь имеют значения последней строки, которую я добавил, когда я смотрю на их раскрывающиеся списки. . 05.05.2021
  • Опубликуйте минимальный воспроизводимый пример, чтобы мы могли скопировать код в нашу IDE и запустить тесты. В противном случае мы все гадаем. 05.05.2021
  • @GilbertLeBlanc, пожалуйста, смотрите обновленный пример 05.05.2021
  • Как правило, вы хотите, чтобы столбец содержал одни и те же доступные параметры для каждого элемента в таблице, но если вам нужно получить это, вам нужно будет создать свой собственный CellEditor и каким-то образом переопределить getComponent(), чтобы вы могли построить ComboBox в это время. , а не использовать один и тот же для всех строк. Может быть, использовать пользовательский прослушиватель для изменения значений при запуске редактирования? 05.05.2021
  • @kendavidson спасибо за ваш вклад. В этом случае мне не нужны одни и те же доступные параметры, потому что каждый новый пользователь будет вводить информацию, которая затем изменит доступные параметры в JComboBox. Но я понимаю, что с точки зрения передового опыта может быть лучший способ сделать это (т.е. повернуть таблицу так, чтобы каждый столбец был «записью») 05.05.2021
  • См.: stackoverflow.com/questions/4211452/ для базового рабочего примера. 05.05.2021

Ответы:


1

Я думаю, что это неправильное представление: JTable не имеет TableColumn объектов для каждой строки и каждого столбца - у него есть только TableColumn объектов для столбцов.

Это означает, что с

TableColumn testColumn1stRow = table.getColumnModel().getColumn(0);
// [...]
TableColumn testColumn2ndRow = table.getColumnModel().getColumn(0);

переменные testColumn1stRow и testColumn2ndRow ссылаются на один и тот же объект TableColumn (тот, что для первого столбца).

Если вам нужны разные JComboBoxes в качестве редакторов ячеек для разных строк, вы должны создать свой собственный подкласс JTable и переопределить public TableCellEditor getCellEditor(int row, int column):

public class MyTable extends JTable {
    // [...]

    @Override
    public TableCellEditor getCellEditor(int row, int column) {
        if (column == 0) {
            List<String> values = getValuesForRow(row);
            JComboBox<String> comboBoxTest = new JComboBox<String>();
            for (int i = 0; i < testArray.size(); i++) {
                comboBoxTest.addItem(testArray.get(i));
            }
            return new DefaultCellEditor(comboBoxTest);
        } else {
            return super.getCellEditor(row, column);
        }
    }

    // [...]
}

Я изобрел метод List<String> getValuesForRow(int row) для заполнения возможных значений для строки просто для того, чтобы пример был коротким.

05.05.2021
  • Спасибо за ответ. Позвольте мне попробовать, и я приму ответ. Пожалуйста, дайте мне пару дней, так как я сейчас работаю над несколькими проектами на работе. Чтобы было ясно, ваш List<String> values будет элементами для этого списка строк со списком? 05.05.2021
  • @will yes, это будут элементы для comboBox этой строки (т.е. в вашем примере один, два, три для первой строки и четыре, пять, шесть для второй строки) 05.05.2021
  • последний уточняющий вопрос. В блоке else оператора if, чтобы быть ясным (я не большой пользователь Java Swing), super.getCellEdititor(row,column) относится к getCellEditor суперкласса JTable (который является обычным классом JTable)? 05.05.2021
  • @будет да, это вызовет getCellEditor(int,int) обычного класса JTable (чтобы редакторы ячеек для других столбцов все еще работали) 05.05.2021
  • @ Томас Клагер, извините за несколько повторов (я знаю, что последний будет последним). Итак, в классе, где я создаю экземпляр JTable, мне нужно изменить его, чтобы он был новым MyJTable правильным? Какие-либо другие изменения или странные функции, которые я должен ожидать? 05.05.2021
  • @will Да, вам нужно будет изменить код, который в настоящее время создает JTable, чтобы создать новый MyTable. Вероятно, вам также нужно добавить конструктор public MyTable(TableModel tm) { super(tm); }. За исключением переопределения getCellEditor() не должно быть неожиданного поведения. 05.05.2021
  • Давайте продолжим обсуждение в чате. 06.05.2021
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..