JTable JComboBox 第一项名称错误
JTable JComboBox wrong first item name
我将 Swing JComboBox
添加到 JTable
,但我的第一个项目的标签始终是 javax.swing.JComboBox(...
我做错了什么?
更新:这是我的代码:
import java.awt.Color;
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
public class TableSelection extends JPanel {
private DefaultTableModel model = new DefaultTableModel();
private JTable table = new JTable(model);
public TableSelection() {
model = (DefaultTableModel) table.getModel();
ArrayList<String> labels = new ArrayList<String>();
labels.add("");
for (int i = 1; i < 10 + 1; i++) {
labels.add("" + (i - 1));
}
model.addColumn("Column");
model.addColumn("Column2");
JComboBox<String> jcombo1 = new JComboBox<String>();
jcombo1.setModel(new DefaultComboBoxModel(labels.toArray()));
jcombo1.setBackground(Color.WHITE);
jcombo1.setSelectedIndex(1);
DefaultCellEditor editor = new DefaultCellEditor(jcombo1);
table.getColumnModel().getColumn(0).setCellEditor(editor);
model.addRow(new JComboBox[]{jcombo1});
table.setPreferredScrollableViewportSize(new Dimension(560, 300));
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.add(new JScrollPane(table));
table.setRowSelectionInterval(0, 0);
}
public static void main(String[] args) {
JFrame f = new JFrame("TableSelection");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new TableSelection());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
问题是您将 JComboBox
添加到 table 模型而不是实际数据。
而不是这个:
model.addRow(new JComboBox[]{jcombo1});
这样做:
model.addRow(new Object[]{labels});
有一个完整的例子here
本质问题在这里:
model.addRow(new JComboBox[]{combo});
不要向 table 模型添加组件。相反,让 renderer 处理工作,使用 "a label that displays the object's string value." 您的初始标签,一个空的 String
,如下所示。
model.addRow(new String[]{labels.get(0)});
另外:
接口代码,例如List<String> labels = new ArrayList<>()
从 event dispatch thread 开始。
测试代码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
public class TableSelection extends JPanel {
private final DefaultTableModel model = new DefaultTableModel();
private final JTable table = new JTable(model);
public TableSelection() {
List<String> labels = new ArrayList<>();
labels.add("");
for (int i = 1; i < 10 + 1; i++) {
labels.add("" + (i - 1));
}
model.addColumn("Column 1");
model.addColumn("Column 2");
JComboBox<String> combo = new JComboBox<>();
combo.setModel(new DefaultComboBoxModel(labels.toArray()));
combo.setBackground(Color.WHITE);
combo.setSelectedIndex(1);
DefaultCellEditor editor = new DefaultCellEditor(combo);
table.getColumnModel().getColumn(0).setCellEditor(editor);
//model.addRow(new JComboBox[]{combo});
model.addRow(new String[]{labels.get(0)});
table.setPreferredScrollableViewportSize(new Dimension(320, 120));
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.add(new JScrollPane(table));
table.setRowSelectionInterval(0, 0);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame("TableSelection");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new TableSelection());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}
我将 Swing JComboBox
添加到 JTable
,但我的第一个项目的标签始终是 javax.swing.JComboBox(...
我做错了什么?
更新:这是我的代码:
import java.awt.Color;
import java.awt.Dimension;
import java.util.ArrayList;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
public class TableSelection extends JPanel {
private DefaultTableModel model = new DefaultTableModel();
private JTable table = new JTable(model);
public TableSelection() {
model = (DefaultTableModel) table.getModel();
ArrayList<String> labels = new ArrayList<String>();
labels.add("");
for (int i = 1; i < 10 + 1; i++) {
labels.add("" + (i - 1));
}
model.addColumn("Column");
model.addColumn("Column2");
JComboBox<String> jcombo1 = new JComboBox<String>();
jcombo1.setModel(new DefaultComboBoxModel(labels.toArray()));
jcombo1.setBackground(Color.WHITE);
jcombo1.setSelectedIndex(1);
DefaultCellEditor editor = new DefaultCellEditor(jcombo1);
table.getColumnModel().getColumn(0).setCellEditor(editor);
model.addRow(new JComboBox[]{jcombo1});
table.setPreferredScrollableViewportSize(new Dimension(560, 300));
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.add(new JScrollPane(table));
table.setRowSelectionInterval(0, 0);
}
public static void main(String[] args) {
JFrame f = new JFrame("TableSelection");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new TableSelection());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
问题是您将 JComboBox
添加到 table 模型而不是实际数据。
而不是这个:
model.addRow(new JComboBox[]{jcombo1});
这样做:
model.addRow(new Object[]{labels});
有一个完整的例子here
本质问题在这里:
model.addRow(new JComboBox[]{combo});
不要向 table 模型添加组件。相反,让 renderer 处理工作,使用 "a label that displays the object's string value." 您的初始标签,一个空的 String
,如下所示。
model.addRow(new String[]{labels.get(0)});
另外:
接口代码,例如
List<String> labels = new ArrayList<>()
从 event dispatch thread 开始。
测试代码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
public class TableSelection extends JPanel {
private final DefaultTableModel model = new DefaultTableModel();
private final JTable table = new JTable(model);
public TableSelection() {
List<String> labels = new ArrayList<>();
labels.add("");
for (int i = 1; i < 10 + 1; i++) {
labels.add("" + (i - 1));
}
model.addColumn("Column 1");
model.addColumn("Column 2");
JComboBox<String> combo = new JComboBox<>();
combo.setModel(new DefaultComboBoxModel(labels.toArray()));
combo.setBackground(Color.WHITE);
combo.setSelectedIndex(1);
DefaultCellEditor editor = new DefaultCellEditor(combo);
table.getColumnModel().getColumn(0).setCellEditor(editor);
//model.addRow(new JComboBox[]{combo});
model.addRow(new String[]{labels.get(0)});
table.setPreferredScrollableViewportSize(new Dimension(320, 120));
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.add(new JScrollPane(table));
table.setRowSelectionInterval(0, 0);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame("TableSelection");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new TableSelection());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}