使用 TableModelListener 设置 JComboBox 编辑器
Setting a JComboBox editor using TableModelListener
我想使用 TableModelListener
将我的第 2 列设置为 JComboBox
编辑器。还想根据第一列中选定的 ComboBox 更改第二列中 ComboBox 的 Model。在这里,我实现了一个监听第一列的监听器。
private class TableScheduleListener implements TableModelListener
{
//Listening for data changes.
@Override
public void tableChanged(TableModelEvent e)
{
int row = e.getFirstRow();
int column = e.getColumn();
}
if(column == 1)
{
for(int i = 0; i < createScheduleView.tblSchedule.getRowCount(); i++)
{
createScheduleView.tblSchedule.getCellEditor(i, 2);
}
int col = createScheduleView.tblSchedule.convertColumnIndexToModel(2);
if(col == 2 && createScheduleView.tblSchedule.getRowCount() < 7)
{
DefaultComboBoxModel cbModel = new DefaultComboBoxModel(createScheduleModel.setData().toArray());
createScheduleView.cbBreakStartTime.setModel(cbModel);
}
}
}
但我在想如何在我的第 2 列中将 JComboBox 设置为编辑器。设置后是什么型号?任何帮助将不胜感激。
更新
我遵循了来自 https://tips4java.wordpress.com/2009/06/28/combo-box-table-editor/ 的 camickr 提示
但是想从不同的 class.
覆盖 TableCellEditor
private class TableScheduleEditor extends JTable
{
// Determine editor to be used by row
@Override
public TableCellEditor getCellEditor(int row, int column)
{
int modelColumn = convertColumnIndexToModel(column);
if(modelColumn == 2 && row < 7)
{
DefaultComboBoxModel model = new DefaultComboBoxModel(createScheduleModel.setData().toArray());
createScheduleView.getCbBreakStartTime().setModel(model);
return new DefaultCellEditor(createScheduleView.getCbBreakStartTime());
}
else
return super.getCellEditor(row, column);
};
}
我在想这个 class 如何在我的 JTable 中注册?
我试图在我的构造函数中注册它 this.createScheduleView.tblSchedule.setCellEditor(new TableScheduleEditor());
但它说不能转换为 TableCellEditor,因为它扩展了 JTable。有什么技巧吗?
Also wanted to change the Model of ComboBox in 2nd column based on selected ComboBox in 1st column
将 JTable
的 getCellEditor(...)
方法覆盖到 return 适当的编辑器。
这是一个让您入门的基本示例:
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 );
}
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();
}
});
}
}
在上面的示例中,"model" 根据正在编辑的行进行更改。
在您的情况下,您需要根据第一列中的值修改 return 编辑器的逻辑。
我想使用 TableModelListener
将我的第 2 列设置为 JComboBox
编辑器。还想根据第一列中选定的 ComboBox 更改第二列中 ComboBox 的 Model。在这里,我实现了一个监听第一列的监听器。
private class TableScheduleListener implements TableModelListener
{
//Listening for data changes.
@Override
public void tableChanged(TableModelEvent e)
{
int row = e.getFirstRow();
int column = e.getColumn();
}
if(column == 1)
{
for(int i = 0; i < createScheduleView.tblSchedule.getRowCount(); i++)
{
createScheduleView.tblSchedule.getCellEditor(i, 2);
}
int col = createScheduleView.tblSchedule.convertColumnIndexToModel(2);
if(col == 2 && createScheduleView.tblSchedule.getRowCount() < 7)
{
DefaultComboBoxModel cbModel = new DefaultComboBoxModel(createScheduleModel.setData().toArray());
createScheduleView.cbBreakStartTime.setModel(cbModel);
}
}
}
但我在想如何在我的第 2 列中将 JComboBox 设置为编辑器。设置后是什么型号?任何帮助将不胜感激。
更新
我遵循了来自 https://tips4java.wordpress.com/2009/06/28/combo-box-table-editor/ 的 camickr 提示 但是想从不同的 class.
覆盖TableCellEditor
private class TableScheduleEditor extends JTable
{
// Determine editor to be used by row
@Override
public TableCellEditor getCellEditor(int row, int column)
{
int modelColumn = convertColumnIndexToModel(column);
if(modelColumn == 2 && row < 7)
{
DefaultComboBoxModel model = new DefaultComboBoxModel(createScheduleModel.setData().toArray());
createScheduleView.getCbBreakStartTime().setModel(model);
return new DefaultCellEditor(createScheduleView.getCbBreakStartTime());
}
else
return super.getCellEditor(row, column);
};
}
我在想这个 class 如何在我的 JTable 中注册?
我试图在我的构造函数中注册它 this.createScheduleView.tblSchedule.setCellEditor(new TableScheduleEditor());
但它说不能转换为 TableCellEditor,因为它扩展了 JTable。有什么技巧吗?
Also wanted to change the Model of ComboBox in 2nd column based on selected ComboBox in 1st column
将 JTable
的 getCellEditor(...)
方法覆盖到 return 适当的编辑器。
这是一个让您入门的基本示例:
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 );
}
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();
}
});
}
}
在上面的示例中,"model" 根据正在编辑的行进行更改。
在您的情况下,您需要根据第一列中的值修改 return 编辑器的逻辑。