我试图在JTable的某个列中放置一个JComboBox。我有这个代码,它正在工作:
model = new DefaultTableModel();
JComboBox<String> optionComboCell = new JComboBox<String>();
optionComboCell.addItem("Option 1");
optionComboCell.addItem("Option 2");
optionComboCell.setSelectedIndex(1);
table = new JTable(model);
// Adding here all the columns, removed for clarity
model.addColumn("Options");
TableColumn optionsColumn = table.getColumn("Options");
optionsColumn.setCellEditor(new DefaultCellEditor(optionComboCell));
我的问题是,在选中该列中的一个单元格之前,它不会显示为JComboBox。加载JFrame时,整个表看起来都一样,好像所有单元格中只有文本。单击时,它会显示组合框的箭头和选项,但再次取消选择时,它看起来像一个常规单元格。
有办法绕过它吗?
同时尝试设置单元渲染器。
您需要定义自己的渲染器,以便在表格上显示组件,因为CellEditor仅用于编辑tablecell中的值(这就是为什么它仅在单击单元格时才会做出反应)。
也许看看Java教程,了解更多关于JTables渲染器和编辑器的概念。
是的,使用JComboBox渲染您的单元格:
import java.awt.Component;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class Test4 {
private static class ComboBoxCellRenderer extends JComboBox implements TableCellRenderer {
public ComboBoxCellRenderer(int column) {
for (int i = 0; i < 10; i++) {
addItem("Cell (" + i + "," + column + ")");
}
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setSelectedItem(value);
return this;
}
}
protected void initUI() {
JFrame frame = new JFrame("test");
frame.add(getTable());
frame.pack();
frame.setVisible(true);
}
private Component getTable() {
Vector<Vector<String>> data = new Vector<Vector<String>>();
for (int i = 0; i < 10; i++) {
Vector<String> row = new Vector<String>();
for (int j = 0; j < 3; j++) {
row.add("Cell (" + i + "," + j + ")");
}
data.add(row);
}
Vector<String> columns = new Vector<String>();
columns.add("Column 1");
columns.add("Column 2");
columns.add("Column 3");
DefaultTableModel model = new DefaultTableModel(data, columns);
JTable table = new JTable(model);
table.setRowHeight(20);
int i = 0;
Enumeration<TableColumn> c = table.getColumnModel().getColumns();
while (c.hasMoreElements()) {
TableColumn column = c.nextElement();
column.setCellRenderer(new ComboBoxCellRenderer(i));
i++;
}
JScrollPane scroll = new JScrollPane(table);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
return scroll;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test4().initUI();
}
});
}
}
所以我需要的功能是组合框,在扩展时可以右键单击,然后弹出菜单显示不同的操作。 为此,我使用以下构造函数扩展了JCombobox: 创建了HistoryComboPopup类,它扩展了BasicComboPopup,并有一个鼠标侦听器 弹出窗口工作,我可以处理它的菜单点击。唯一的麻烦是当我打开JPopupMenu时,组合框关闭,我点击右键的项目不再出现。 我目前不知道该怎么办,所以任何帮助都将不胜感
问题内容: 是否可以在JComboBox中定义与实际内容不同的值? 在HTML中,其外观如下: 无论内容多长时间,都可以在此处获得一个短值。 在Java中,我只知道以下解决方案: 但是在这里,我只会得到“ Cat”,“ Dog”等信息 。问题是,我要将客户的所有名称从数据库加载到JComboBox中,然后从所选客户中检索ID。它看起来应该像这样: 问题答案: 如果创建Customer类并将Cust
介绍 (Introduction) JComboBox类是一个组合按钮或可编辑字段和下拉列表的组件。 Class 声明 (Class Declaration) 以下是javax.swing.JComboBox类的声明 - public class JComboBox extends JComponent implements ItemSelectable, ListDataLis
我有一个在运行时加载行的表。加载后,用户需要在每一行的第一列中从中选择一个项目。然后他需要在每行的同一行上从另一个中选择一个项目。第二个的内容取决于第一个的选择。 我现在的编码方式是更改整个第二列的combobox内容。 有没有一种方法可以让每一行的组合框对象都不一样,这样我就可以在第一个组合框中选择一个值的时候处理它?
问题内容: 我正在尝试结合2个jcombobox。1个组合框用于显示费用类别。第二个组合框正在从文本文件读取文件以显示产品类型。如果我更改第一个组合框,我希望第二个组合框将根据用户在第一个组合框中的选择进行更改。 我是否仍有可能从文本文件加载其他组合框?该子项将不是Arrays,而是与以前相同,因为它位于cboperson代码的底部。 编辑的代码: 问题答案: 例如
我创建了包含员工信息的。在这个JTable中,我添加了名为“资历”的列。此列由表示(每行的内容不同)。例如: 内容取自。 问题是在第1行和第2行中选择的项目是“程序员”,但是“程序员”不应该出现在第2行中。只有当我单击时,才会出现正确的列表,即第2行-{“writer”,“editor”}。