Java 为什么我表中的每个JCombo框都显示相同的值列表?
两行中仅显示最近的组合框值 更新的MVCE示例: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
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);
}
}
// [...]
}