Java 为什么我表中的每个JCombo框都显示相同的值列表?

Java 为什么我表中的每个JCombo框都显示相同的值列表?,java,swing,jtable,jcombobox,Java,Swing,Jtable,Jcombobox,两行中仅显示最近的组合框值 更新的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 jav

两行中仅显示最近的组合框值

更新的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));
   }
}
packagemain;
导入java.awt.Color;
导入java.awt.Font;
导入java.util.ArrayList;
导入javax.swing.DefaultCellEditor;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableColumn;
公共类SwingDemo{
公共静态void main(字符串[]argv)引发异常{
DefaultTableModel=新的DefaultTableModel();
模型。添加栏(“第1栏”);
JTable table=新的JTable(模型);
Font Font=新字体(“Verdana”,Font.PLAIN,12);
表.setFont(字体);
表3.设置行高(30);
表.立根背景(橙色);
表.设置前景(颜色.白色);
JFrame=新JFrame();
框架。设置尺寸(600400);
frame.add(新的JScrollPane(表));
frame.setVisible(true);
//添加第一行
model.addRow(“.split(”);
TableColumn testColumn1stRow=table.getColumnModel().getColumn(0);
JComboBox ComboxTest=新的JComboBox();
ArrayList testArray=新的ArrayList();
添加(“一”);
添加(“两个”);
添加(“三”);
对于(int i=0;i
实际上,每次我添加一行时,它都会运行此代码,然后列中的每一行都具有最近添加的组合框的值


有没有关于如何解决这个问题的想法?

我认为有一个误解:
JTable
没有
TableColumn
对象用于每一行和每一列-它只有
TableColumn
对象用于列

这意味着

TableColumn testColumn1stRow = table.getColumnModel().getColumn(0);
// [...]
TableColumn testColumn2ndRow = table.getColumnModel().getColumn(0);
变量
testColumn1stRow
testColumn2ndRow
引用相同的
TableColumn
对象(第一列的对象)

如果需要不同的
JComboBox
es作为不同行的单元格编辑器,则必须创建自己的
JTable
子类并重写
public TableCellEditor getCellEditor(int行,int列)

公共类MyTable扩展了JTable{
// [...]
@凌驾
公共表CellEditor getCellEditor(int行,int列){
如果(列==0){
列表值=GetValuesError(行);
JComboBox ComboxTest=新的JComboBox();
对于(int i=0;i

我发明了一种方法
List getValuesForRow(int row)
来填充一行的可能值,只是为了使示例简短。

最有可能的是
wpsListObj.getWps_List()
返回的列表对于所有行都是相同的。您是如何创建此支持列表的?@Lino事实并非如此。谢谢你的意见。我证实了这一点。我认为这与以下事实有关:
TableColumn wpsColumn
影响每一行,因为它作为一个整体处理列。我将查看一个下拉列表JComboBox,它将具有该行的正确值,但是当我添加一个应该具有不同值的新行时,所有以前的行现在都具有我在查看其下拉列表时添加的最新行的值。请发布一个链接,以便我们可以将代码复制到IDE中并运行测试。否则,我们都在猜测。@GilbertLeBlanc请参见更新的示例参见:了解基本的工作示例。谢谢您的回复。让我试试看,我会接受答案的。请给我几天时间,因为我现在正在做几个项目。为了清楚起见,您的
列表值将是该行组合框的项目?@是的,这将是该行组合框的项目(即,在您的示例中,第一行的“一”、“二”、“三”和第二行的“四”、“五”、“六”)最后一个后续问题。在if语句的
else
块中(我不是一个Java Swing用户),
super.getCellEditor(行,列)
指的是超类JTable(这是正常的JTable类)的
getCellEditor
。@是的,这将调用
getCellEditor(int,int)正常
JTable
类的
(以便其他列的单元格编辑器仍然工作)@是的,您需要更改当前创建
JTable
的代码以创建新的
MyTable
。您可能还需要添加构造函数
publicmytable(tablemodeltm){super(tm);}
。除了
getCellEditor()
覆盖之外,不应该有任何意外行为。
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);
        }
    }

    // [...]
}