[英]Java JTable with JComboBox
我試圖將JComboBox放在JTable的特定列中。 我有此代碼,並且可以正常工作:
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時,整個表看起來相同,就好像所有單元格都只有文本一樣。 單擊時,它顯示組合框的箭頭和選項,但是再次取消選中時,它看起來像常規單元格。
有辦法解決這個問題嗎?
是的,請使用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();
}
});
}
}
您將需要定義自己的渲染器以在表上顯示組件,因為僅需要CellEditor才能編輯表單元格中的值(這就是為什么單擊單元格時它僅會起作用的原因)。
也許看看Java教程,以了解有關JTables的渲染器和編輯器概念的更多信息。
嘗試同時設置單元格渲染器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.