[英]Updating JComboBox in a single cell in JTable
我需要根据在同一表中执行的操作,用组件(JComboBox)填充JTable中的特定单元格。
我已经设置了JTable。 A列中的所有单元格都填充有JComboBox。
我想为此修改我的代码(可以在下面找到),以便当用户在特定行的JComboBox中选择一个选项时,同一行(在B列中)的下一个字段将填充新的JComboBox中包含不同的项目。
这里的问题是我不想使用相同的JComboBox填充整个B列。 根据在A列中所做的选择,表中的每一行在B列的JComboBox中可以有不同的选项。
如何更改我的代码来做到这一点?
String sql = "SELECT * from tblDepartment ORDER BY deptName";
int size = 0;
int count = 0;
try {
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
List<String> list = new ArrayList<>();
while (rs.next()) {//adds each item to the list for the combo box
list.add(rs.getString("deptName"));
}
count = list.size();
String[] items = list.toArray(new String[list.size()]);
JComboBox<String> jcb = new JComboBox<>(items);
TableColumn tc = tblCon.getColumnModel().getColumn(2);
TableCellEditor tce = new DefaultCellEditor(jcb);//adds the combo box to the relevant cell in the table.
tc.setCellEditor(tce);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, e);
}
您可以重写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();
}
});
}
}
在上面的示例中,编辑器仅由行确定。
在您的情况下,编辑器将由上一行中的行和数据确定。
您是否尝试过使用自定义TableCellEditor
? 您可以使用称为getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
的可重写方法getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
在其中可以显式定义JComboBox
应该出现的行和列。
这是JCheckBox
的示例:
public class EditBoolean extends AbstractCellEditor implements TableCellEditor {
private JCheckBox box;
public EditBoolean() {
// This is the component that will handle the editing of the cell value
box = new JCheckBox();
}
// This method is called when editing is completed.
// It must return the new value to be stored in the cell.
@Override
public Object getCellEditorValue() {
return box.isSelected();
}
// This method is called when a cell value is edited by the user.
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
if(column == 2 && row == 4){
if (value instanceof Boolean) {
box.setSelected((Boolean) (value));
} else {
box.setSelected(Boolean.getBoolean((String) value));
}
return box;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.