[英]Placeholder for editable JComboBox in JTable
我有一個JTable
,其中一個列(第1列)是一個JComboBox,它允許從列表中進行選項,並可以在其中輸入新的選項。 MWE:
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableColumn;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.HashSet;
public class ComboTableDemo extends JPanel {
public ComboTableDemo() {
super(new GridLayout(1,0));
final String[] headings = {"Name", "Option"};
final String string1 = "Foo";
final String string2 = "Bar";
Object[][] data = {
{"Albert", string1},
{"Bob", null},
{"Clare", null},
{"David", null}
};
final JTable table = new JTable(data, headings);
table.setPreferredScrollableViewportSize(new Dimension(300, 100));
table.setFillsViewportHeight(true);
final String[] optionsInit = new String[] {string1, string2};
HashSet<String> options = new HashSet<String>(Arrays.asList(optionsInit));
JComboBox<String> optionsCombo = new JComboBox<String>(optionsInit);
optionsCombo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
String newSelection = (String)optionsCombo.getSelectedItem();
if(!options.contains(newSelection)) {
options.add(newSelection);
optionsCombo.addItem(newSelection);
}
}
});
optionsCombo.setEditable(true);
TableColumn column = table.getColumnModel().getColumn(1);
column.setCellEditor(new DefaultCellEditor(optionsCombo));
add(new JScrollPane(table));
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("ComboTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ComboTableDemo pane = new ComboTableDemo();
pane.setOpaque(true);
frame.setContentPane(pane);
frame.pack();
frame.setVisible(true);
}
});
}
}
在表中,用戶可以並且應該為空條目輸入值並不明顯,因此我想添加占位符文本以使這一點變得清楚。 我在其他地方看到過,在無法編輯的連擊情況下,可以為setRenderer
提供自定義ListCellRenderer
,但是在可編輯的連擊情況下(如本教程中所述),看來必須使用setEditor
提供ComboBoxEditor
。 為此是否有一個簡單的實現,或者甚至是達到相同目的的更好方法?
實際上, JTable
輸入組件代表一種特殊情況,因為它們僅在單元格被編輯時才處於活動狀態。 因此,除了設置編輯器以控制值的編輯方式外,還需要更改渲染器以控制如何顯示所選值。
// As before:
TableColumn column = table.getColumnModel().getColumn(1);
column.setCellEditor(new DefaultCellEditor(optionsCombo));
// Additional line to set renderer:
column.setCellRenderer(new PlaceholderRenderer("<choose or add option>"));
這里PlaceholderRenderer
應該是一個TableCellRenderer
實現,當沒有選擇任何值時,該實現將顯示占位符字符串。 例如:
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class PlaceholderRenderer extends DefaultTableCellRenderer {
final private String placeholder;
public PlaceholderRenderer(String placeholder) {
super();
this.placeholder = placeholder;
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
if ((value == null) || (value.equals(""))) {
return super.getTableCellRendererComponent(table, this.placeholder, isSelected, hasFocus, row, column);
} else {
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.