如何从给定列中创建单个单元格作为 JTable 中的下拉列表
How to make single cell from a given column as drop down in JTable
我的 JTable 中有一个下拉列表和简单的文本字段,根据在下拉列表中选择的特定值,我想将文本字段也更改为下拉列表。
下面是我正在使用的代码,我可以根据选择将文本字段转换为下拉列表,但问题是它将列中的所有文本字段转换为下拉列表。我只想将所选行更改为下拉,其余应保留为文本字段。
comboBox2.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent arg0) {
String properties = (String) comboBox2.getSelectedItem();
try {
switch (properties) {
case "Choose Object":
dd_OR = table.getColumnModel().getColumn(3);
model1 = new DefaultComboBoxModel<String>();
model1.addElement("");
model1.addElement("Snowboarding");
model1.addElement("Rowing");
model1.addElement("Knitting");
JComboBox comboBox3 = new JComboBox<String>(model1);
AutoCompleteDecorator.decorate(comboBox3);
dd_OR.setCellEditor(new DefaultCellEditor(comboBox3));
break;
}
将单元格编辑器设置为 DefaultCellEditor 将应用于第 3 列中的所有行。请按照下面给出的上述代码
TableColumn column = table.getColumnModel().getColumn(3);
column.setCellEditor(new CustomTableCellEditor());
CustomTableEditor 将是
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
public class CustomTableCellEditor extends AbstractCellEditor implements TableCellEditor {
/**
*
*/
private static final long serialVersionUID = -6924557080981304281L;
private JComboBox<String> editor;
private String [] values = {"","Snowboarding", "Rowing", "Knitting"};
public CustomTableCellEditor() {
// Create a new Combobox with the array of values.
editor = new JComboBox<String>(values);
}
@Override
public Object getCellEditorValue() {
// TODO Auto-generated method stub
return editor.getSelectedItem();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int colIndex) {
// Set the model data of the table
if(isSelected)
{
// Do Whatever you want
}
return editor;
}
}
希望对您有所帮助
谢谢
拉杰库玛
一种方法是覆盖 JTable
的 getCellEditor(...)
方法,这样您就可以动态确定要使用的编辑器。
这是一个简单的入门示例:
import java.awt.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.*;
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 );
// table.getColumnModel().getColumn(1).setCellRenderer(new ComboBoxRenderer2() );
}
/*
class ComboBoxRenderer2 extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
label.setIcon(UIManager.getIcon("Table.descendingSortIcon"));
return label;
}
}
*/
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();
}
});
}
}
我的 JTable 中有一个下拉列表和简单的文本字段,根据在下拉列表中选择的特定值,我想将文本字段也更改为下拉列表。
下面是我正在使用的代码,我可以根据选择将文本字段转换为下拉列表,但问题是它将列中的所有文本字段转换为下拉列表。我只想将所选行更改为下拉,其余应保留为文本字段。
comboBox2.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent arg0) {
String properties = (String) comboBox2.getSelectedItem();
try {
switch (properties) {
case "Choose Object":
dd_OR = table.getColumnModel().getColumn(3);
model1 = new DefaultComboBoxModel<String>();
model1.addElement("");
model1.addElement("Snowboarding");
model1.addElement("Rowing");
model1.addElement("Knitting");
JComboBox comboBox3 = new JComboBox<String>(model1);
AutoCompleteDecorator.decorate(comboBox3);
dd_OR.setCellEditor(new DefaultCellEditor(comboBox3));
break;
}
将单元格编辑器设置为 DefaultCellEditor 将应用于第 3 列中的所有行。请按照下面给出的上述代码
TableColumn column = table.getColumnModel().getColumn(3);
column.setCellEditor(new CustomTableCellEditor());
CustomTableEditor 将是
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
public class CustomTableCellEditor extends AbstractCellEditor implements TableCellEditor {
/**
*
*/
private static final long serialVersionUID = -6924557080981304281L;
private JComboBox<String> editor;
private String [] values = {"","Snowboarding", "Rowing", "Knitting"};
public CustomTableCellEditor() {
// Create a new Combobox with the array of values.
editor = new JComboBox<String>(values);
}
@Override
public Object getCellEditorValue() {
// TODO Auto-generated method stub
return editor.getSelectedItem();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int colIndex) {
// Set the model data of the table
if(isSelected)
{
// Do Whatever you want
}
return editor;
}
}
希望对您有所帮助
谢谢 拉杰库玛
一种方法是覆盖 JTable
的 getCellEditor(...)
方法,这样您就可以动态确定要使用的编辑器。
这是一个简单的入门示例:
import java.awt.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.*;
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 );
// table.getColumnModel().getColumn(1).setCellRenderer(new ComboBoxRenderer2() );
}
/*
class ComboBoxRenderer2 extends DefaultTableCellRenderer
{
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
label.setIcon(UIManager.getIcon("Table.descendingSortIcon"));
return label;
}
}
*/
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();
}
});
}
}