Java 动态填充JComboBox,当它';它用作表格编辑器
我有一个用例(在Java Swing中),其中某个Java 动态填充JComboBox,当它';它用作表格编辑器,java,swing,jtable,Java,Swing,Jtable,我有一个用例(在Java Swing中),其中某个JTable列必须通过jcombox编辑器进行编辑,但可选择的值列表取决于行的域对象(我使用的是自定义TableModel) 当编辑停止或取消时,CellEditor界面有要调用的事件,但没有开始编辑的事件(我希望这是填写选择值列表的好地方) 编辑单元格开始时,如何填充组合框?组合框中可用的项目取决于其型号。自定义您的方法(特别是getElementAt(int)方法),以便它参考相关的域对象 您可能希望扩展DefaultComboxModel,
JTable
列必须通过jcombox
编辑器进行编辑,但可选择的值列表取决于行的域对象(我使用的是自定义TableModel
)
当编辑停止或取消时,CellEditor
界面有要调用的事件,但没有开始编辑的事件(我希望这是填写选择值列表的好地方)
编辑单元格开始时,如何填充组合框?组合框中可用的项目取决于其型号。自定义您的方法(特别是
getElementAt(int)
方法),以便它参考相关的域对象
您可能希望扩展
DefaultComboxModel
,而不是从头开始实现接口。ComboBox中可用的项目是其模型的责任。自定义您的方法(特别是getElementAt(int)
方法),以便它参考相关的域对象
您可能希望扩展
DefaultComboxModel
,而不是从头开始实现接口。ComboBox中可用的项目是其模型的责任。自定义您的方法(特别是getElementAt(int)
方法),以便它参考相关的域对象
您可能希望扩展
DefaultComboxModel
,而不是从头开始实现接口。ComboBox中可用的项目是其模型的责任。自定义您的方法(特别是getElementAt(int)
方法),以便它参考相关的域对象
您可能希望扩展
DefaultComboxModel
,而不是从头开始实现接口。这是一个问题,我今年早些时候必须解决这个问题(下面的代码来自该项目)。解决方案是为组合框创建一个专用模型:
mEntityListModel = getMyEntityModel();
T[] items = (T[]) Array.newInstance(type, mEntityListModel.getSize());
for (int i = 0; i < items.length; i++) {
items[i] = mEntityListModel.getElementAt(i);
}
mComboBoxModel = new DefaultComboBoxModel<T>(items);
旁注:这是如何注册表组合框中的更改的:
tablecolumn.getCellEditor()
.addCellEditorListener(new CellChangeListener());
private class CellChangeListener implements CellEditorListener {
@Override
public void editingStopped(ChangeEvent e) {
DefaultCellEditor editor;
Object newValue;
if (e.getSource() instanceof DefaultCellEditor) {
editor = (DefaultCellEditor) e.getSource();
newValue = editor.getCellEditorValue();
if (newValue != null) {
//set the newValue for the combobox selection manager
}
}
}
@Override
public void editingCanceled(ChangeEvent e) {
}
}
如您所见,组合框项目列表在编辑器开始工作之前更新。编辑不负责这项工作。这是一个问题,我必须在今年早些时候解决(下面的代码来自该项目)。解决方案是为组合框创建一个专用模型:
mEntityListModel = getMyEntityModel();
T[] items = (T[]) Array.newInstance(type, mEntityListModel.getSize());
for (int i = 0; i < items.length; i++) {
items[i] = mEntityListModel.getElementAt(i);
}
mComboBoxModel = new DefaultComboBoxModel<T>(items);
旁注:这是如何注册表组合框中的更改的:
tablecolumn.getCellEditor()
.addCellEditorListener(new CellChangeListener());
private class CellChangeListener implements CellEditorListener {
@Override
public void editingStopped(ChangeEvent e) {
DefaultCellEditor editor;
Object newValue;
if (e.getSource() instanceof DefaultCellEditor) {
editor = (DefaultCellEditor) e.getSource();
newValue = editor.getCellEditorValue();
if (newValue != null) {
//set the newValue for the combobox selection manager
}
}
}
@Override
public void editingCanceled(ChangeEvent e) {
}
}
如您所见,组合框项目列表在编辑器开始工作之前更新。编辑不负责这项工作。这是一个问题,我必须在今年早些时候解决(下面的代码来自该项目)。解决方案是为组合框创建一个专用模型:
mEntityListModel = getMyEntityModel();
T[] items = (T[]) Array.newInstance(type, mEntityListModel.getSize());
for (int i = 0; i < items.length; i++) {
items[i] = mEntityListModel.getElementAt(i);
}
mComboBoxModel = new DefaultComboBoxModel<T>(items);
旁注:这是如何注册表组合框中的更改的:
tablecolumn.getCellEditor()
.addCellEditorListener(new CellChangeListener());
private class CellChangeListener implements CellEditorListener {
@Override
public void editingStopped(ChangeEvent e) {
DefaultCellEditor editor;
Object newValue;
if (e.getSource() instanceof DefaultCellEditor) {
editor = (DefaultCellEditor) e.getSource();
newValue = editor.getCellEditorValue();
if (newValue != null) {
//set the newValue for the combobox selection manager
}
}
}
@Override
public void editingCanceled(ChangeEvent e) {
}
}
如您所见,组合框项目列表在编辑器开始工作之前更新。编辑不负责这项工作。这是一个问题,我必须在今年早些时候解决(下面的代码来自该项目)。解决方案是为组合框创建一个专用模型:
mEntityListModel = getMyEntityModel();
T[] items = (T[]) Array.newInstance(type, mEntityListModel.getSize());
for (int i = 0; i < items.length; i++) {
items[i] = mEntityListModel.getElementAt(i);
}
mComboBoxModel = new DefaultComboBoxModel<T>(items);
旁注:这是如何注册表组合框中的更改的:
tablecolumn.getCellEditor()
.addCellEditorListener(new CellChangeListener());
private class CellChangeListener implements CellEditorListener {
@Override
public void editingStopped(ChangeEvent e) {
DefaultCellEditor editor;
Object newValue;
if (e.getSource() instanceof DefaultCellEditor) {
editor = (DefaultCellEditor) e.getSource();
newValue = editor.getCellEditorValue();
if (newValue != null) {
//set the newValue for the combobox selection manager
}
}
}
@Override
public void editingCanceled(ChangeEvent e) {
}
}
如您所见,组合框项目列表在编辑器开始工作之前更新。编辑器不负责该工作。一种方法是重写JTable的
getCellEditor(…)
方法:
import java.awt.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class TableComboBoxByRow extends JPanel
{
List<String[]> editorData = new ArrayList<String[]>(3);
public TableComboBoxByRow()
{
setLayout( new BorderLayout() );
// Create the editorData to be used for each row
editorData.add( new String[]{ "Red", "Blue", "Green" } );
editorData.add( new String[]{ "Circle", "Square", "Triangle" } );
editorData.add( new String[]{ "Apple", "Orange", "Banana" } );
// Create the table with default data
Object[][] data =
{
{"Color", "Red"},
{"Shape", "Square"},
{"Fruit", "Banana"},
{"Plain", "Text"}
};
String[] columnNames = {"Type","Value"};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
JTable table = new JTable(model)
{
// Determine editor to be used by row
public TableCellEditor getCellEditor(int row, int column)
{
int modelColumn = convertColumnIndexToModel( column );
if (modelColumn == 1 && row < 3)
{
JComboBox<String> comboBox1 = new JComboBox<String>( editorData.get(row));
return new DefaultCellEditor( comboBox1 );
}
else
return super.getCellEditor(row, column);
}
};
JScrollPane scrollPane = new JScrollPane( table );
add( scrollPane );
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("Table Combo Box by Row");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new TableComboBoxByRow() );
frame.setSize(200, 200);
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
import java.awt.*;
导入java.util.List;
导入java.util.ArrayList;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.table.*;
公共类TableComboBoxByRow扩展了JPanel
{
List editorData=new ArrayList(3);
公共表ComboxBoxByRow()
{
setLayout(新的BorderLayout());
//创建要用于每行的editorData
add(新字符串[]{“红色”、“蓝色”、“绿色”});
add(新字符串[]{“圆”、“正方形”、“三角形”});
add(新字符串[]{“Apple”、“Orange”、“Banana”});
//使用默认数据创建表
对象[][]数据=
{
{“颜色”,“红色”},
{“形状”,“正方形”},
{“水果”,“香蕉”},
{“纯”、“文本”}
};
字符串[]columnNames={“类型”,“值”};
DefaultTableModel=新的DefaultTableModel(数据、列名称);
JTable表格=新JTable(型号)
{
//确定行要使用的编辑器
公共表CellEditor getCellEditor(int行,int列)
{
int modelColumn=convertColumnIndexToModel(列);
if(modelColumn==1&&row<3)
{
JComboBox comboBox1=新的JComboBox(editorData.get(row));
返回新的DefaultCellEditor(comboBox1);
}
其他的
返回super.getCellEditor(行、列);
}
};
JScrollPane scrollPane=新的JScrollPane(表);
添加(滚动窗格);
}
私有静态void createAndShowUI()
{
JFrame frame=新JFrame(“按行排列的表格组合框”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新的tableComboxByRow());
框架。设置尺寸(200200);
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable()
{
公开募捐
{
createAndShowUI();
}
});
}
}
一种方法是重写JTable的getCellEditor(…)
方法:
import java.awt.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class TableComboBoxByRow extends JPanel
{
List<String[]> editorData = new ArrayList<String[]>(3);
public TableComboBoxByRow()
{
setLayout( new BorderLayout() );
// Create the editorData to be used for each row
editorData.add( new String[]{ "Red", "Blue", "Green" } );
editorData.add( new String[]{ "Circle", "Square", "Triangle" } );
editorData.add( new String[]{ "Apple", "Orange", "Banana" } );
// Create the table with default data
Object[][] data =
{
{"Color", "Red"},
{"Shape", "Square"},
{"Fruit", "Banana"},
{"Plain", "Text"}
};
String[] columnNames = {"Type","Value"};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
JTable table = new JTable(model)
{
// Determine editor to be used by row
public TableCellEditor getCellEditor(int row, int column)
{
int modelColumn = convertColumnIndexToModel( column );
if (modelColumn == 1 && row < 3)
{
JComboBox<String> comboBox1 = new JComboBox<String>( editorData.get(row));
return new DefaultCellEditor( comboBox1 );
}
else
return super.getCellEditor(row, column);
}
};
JScrollPane scrollPane = new JScrollPane( table );
add( scrollPane );
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("Table Combo Box by Row");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new TableComboBoxByRow() );
frame.setSize(200, 200);
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
import java.awt.*;
导入java.util.List;
导入java.util.ArrayList;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.table.*;
公共类TableComboBoxByRow扩展了JPanel
{
列表编辑器数据=ne