设置 TableCellRenderer 在“JComboBox”的值列表顶部添加一个空值
Setting TableCellRenderer adds an empty value atop of value list of `JComboBox`
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 会使组合在所有其他值之上选择一个空选项,而没有任何人告诉它这样做。空条目不知从何而来。
如何让组合 select 在第一时间成为 "One" 条目,而不是“ ”?实现自定义渲染器时我错过了什么??我关注了这里:
Oracle tutorial of How to Use Tables - Swing - Java SE
另外,直到我点击它才显示组合。我不认为这是展示它的正确方式。我在这里尝试了另一个例子:
Show a JComboBox with custom editor and renderer, example from java2s.com
但我仍然很困惑。
How can I make the combo select the "One" entry at first moment,
这是默认行为。来自 TableModel 的数据用于 select 调用编辑器时组合框中的项目。
Using a ComboBox as an Editor 上的 Swing 教程部分包含一个演示如何执行此操作的工作示例。
the combo is not shown until I click it
这就是它的设计方式。渲染器正常显示数据。在用户开始编辑单元格之前,不会显示编辑器。
如果您想向用户表明组合框将用作编辑器,那么您需要使用自定义渲染器。您尝试的实施是不正确的,因为您永远不会将 JCombobox 作为 table 模型中的数据。
查看:How to make a JComboBox table editor have the design of an ordinary JComboBox? 可能的渲染器的几个不同实现:
- 我的示例展示了使用真正的组合框会是什么样子(我不喜欢它)并且
- 接受的答案显示了更好的渲染器。您可能希望更改示例以将面板作为带有 BorderLayout 的渲染器。然后将标签添加到 LINE_START,将图标添加到 LINE_END,这样图标就更像一个组合框,右边有向下箭头。
编辑:
but in your link, the combobox is showing the first option
不,不是。再次测试代码。单击第 2 行或第 3 行以调用编辑器以查看select编辑了哪个项目。
澄清一下我之前说的。组合框中的项目是根据 TableModel 中的数据 select 编辑的。由于您的 TableModel 是空的,因此 select.
没有项目
将一些数据放入 TableModel。 Swing 教程中的示例和 link 中的两个示例我为您提供了 TableModel 中的所有数据,这就是它们起作用的原因。
谢谢罗伯·卡米克。我不会再穿越-posting了。
我找到问题了。在默认渲染器中,我放了一行这样的代码:
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;
}
}
加载组合时,值始终为空,而我让组合select它,所以出现空行。点个赞就好了
在 CodeRanch 中,我 post 这个和系统将其视为垃圾邮件,我不知道为什么。虽然我自己找到了解决方案,但我接受你的帮助。
再次感谢。
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 会使组合在所有其他值之上选择一个空选项,而没有任何人告诉它这样做。空条目不知从何而来。
如何让组合 select 在第一时间成为 "One" 条目,而不是“ ”?实现自定义渲染器时我错过了什么??我关注了这里:
Oracle tutorial of How to Use Tables - Swing - Java SE
另外,直到我点击它才显示组合。我不认为这是展示它的正确方式。我在这里尝试了另一个例子:
Show a JComboBox with custom editor and renderer, example from java2s.com
但我仍然很困惑。
How can I make the combo select the "One" entry at first moment,
这是默认行为。来自 TableModel 的数据用于 select 调用编辑器时组合框中的项目。
Using a ComboBox as an Editor 上的 Swing 教程部分包含一个演示如何执行此操作的工作示例。
the combo is not shown until I click it
这就是它的设计方式。渲染器正常显示数据。在用户开始编辑单元格之前,不会显示编辑器。
如果您想向用户表明组合框将用作编辑器,那么您需要使用自定义渲染器。您尝试的实施是不正确的,因为您永远不会将 JCombobox 作为 table 模型中的数据。
查看:How to make a JComboBox table editor have the design of an ordinary JComboBox? 可能的渲染器的几个不同实现:
- 我的示例展示了使用真正的组合框会是什么样子(我不喜欢它)并且
- 接受的答案显示了更好的渲染器。您可能希望更改示例以将面板作为带有 BorderLayout 的渲染器。然后将标签添加到 LINE_START,将图标添加到 LINE_END,这样图标就更像一个组合框,右边有向下箭头。
编辑:
but in your link, the combobox is showing the first option
不,不是。再次测试代码。单击第 2 行或第 3 行以调用编辑器以查看select编辑了哪个项目。
澄清一下我之前说的。组合框中的项目是根据 TableModel 中的数据 select 编辑的。由于您的 TableModel 是空的,因此 select.
没有项目将一些数据放入 TableModel。 Swing 教程中的示例和 link 中的两个示例我为您提供了 TableModel 中的所有数据,这就是它们起作用的原因。
谢谢罗伯·卡米克。我不会再穿越-posting了。
我找到问题了。在默认渲染器中,我放了一行这样的代码:
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;
}
}
加载组合时,值始终为空,而我让组合select它,所以出现空行。点个赞就好了
在 CodeRanch 中,我 post 这个和系统将其视为垃圾邮件,我不知道为什么。虽然我自己找到了解决方案,但我接受你的帮助。
再次感谢。