SCCEE:
import java.awt.EventQueue;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
public class TC extends JFrame{
public TC(){
begin();
}
private void begin(){
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setTitle("nothing.");
String[] options = {"One", "Two", "Three"};
JComboBox<String> combo = new JComboBox<>(options);
JTable table = new JTable(new Object[2][2], new String[]{"One", "Two"});
TableColumn col0 = table.getColumnModel().getColumn(0);
col0.setCellEditor(new DefaultCellEditor(combo));
class MyRender extends DefaultTableCellRenderer {
public MyRender() {
}
@Override
public void setValue(Object value) {
if (value instanceof JComboBox) {
setText(((JComboBox) value).getSelectedItem().toString());
}
}
}
MyRender renderer = new MyRender();
col0.setCellRenderer(renderer);
JScrollPane sp = new JScrollPane(table);
getContentPane().add(sp);
pack();
setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
@Override
public void run() {
TC tc = new TC();
}
});
}
}
我的问题是:设置TableCellRenderer使组合选择所有其他值的空选项,没有人告诉它这样做。空的条目来自无处。
如何让组合在第一时间选择“一个”条目,而不是“”?实现自定义渲染器时我错过了什么?我跟在这里:
Oracle tutorial of How to Use Tables - Swing - Java SE
此外,直到我点击它才会显示组合。我不认为这是展示它的正确方法。我试着在这里跟随另一个例子:
Show a JComboBox with custom editor and renderer, example from java2s.com
但我仍然感到困惑。
答案 0 :(得分:1)
如何让组合选择&#34; One&#34;第一时间进入,
这是默认行为。 TableModel中的数据用于在调用编辑器时选择组合框中的项目。
Using a ComboBox as an Editor上的Swing教程中的部分包含一个显示如何执行此操作的工作示例。
直到我点击它才会显示组合
这是它的设计方式。渲染器正常显示数据。在用户开始编辑单元格之前,不会显示编辑器。
如果要向用户显示组合框将用作编辑器的指示,则需要使用自定义渲染器。您尝试的实现不正确,因为您永远不会将JCombobox作为表模型中的数据。
对于可能的渲染器的几种不同实现,请查看:How to make a JComboBox table editor have the design of an ordinary JComboBox?:
编辑:
但在您的链接中,组合框显示第一个选项
不,不是。再次测试代码。单击第2行或第3行以调用编辑器以查看选择了哪个项目。
澄清我之前说过的话。根据TableModel中的数据选择组合框中的项目。由于您的TableModel为空,因此无法选择项目。
在TableModel中放入一些数据。 Swing教程中的示例和我提供的链接中的两个示例都包含TableModel中的数据,这就是它们工作的原因。
答案 1 :(得分:0)
谢谢Rob Carmick。我不会再发帖了。
我发现了这个问题。在默认渲染器中,我放了一行代码:
class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
public MyComboBoxRenderer(JComboBox<String> combo) {
super(combo.getModel());
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
// setSelectedItem(value); // where lies the problem, will always be null.
return this;
}
}
当加载组合时,该值始终为null,我让组合选择它,因此出现空行。评论它,一切都很好。
在CodeRanch中我发布了这个,系统将其视为垃圾邮件,我不知道为什么。虽然我自己找到了解决方案,但我接受你的帮助。
再次感谢。