[英]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;
}
一種方法是重寫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();
}
});
}
}
將單元格編輯器設置為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;
}
}
希望對您有幫助
感謝Rajkumar
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.