java - JTable 中特定单元格中的 JComboBox
问题描述
我想知道如何在 JTable 的特定单元格中设置 JComboBox。我见过人们使用TableColumn setCellEditor(new DefaultCellEditor(comboBox))
.
但这是针对整个专栏的,我想要一个特定的单元格。所以也许我应该做一个适合我需要的定制TableCellEditor
,但我对如何做有点迷茫......
这样做的目的是管理参数过滤器。有两种过滤器:
- 比较两个值的值,例如:气球数 > 5
- 一个会说是一个值在一个值范围内,例如:参数名称在 {"one", "two", "three", "seven"} 内。
我的 JTable 的屏幕截图:
正如我们在图片中看到的,当有“比较器”“在其中”时,我们需要一个JComboBox
incell[0][2]
来选择一组完整字段中的范围值。虽然cell[1][2]
不需要JComboBox
,而只是一个可编辑的单元格。
我希望我已经清楚并感谢您的帮助。
编辑:我能够显示一个 JComboBox 只是为了实现,我无法在其上选择多个值。所以现在我试图显示一个 JList 而不是一个 ComboBox。但是当我点击单元格时,没有显示JList,我不知道为什么。这是我的代码:
JTable tableParametersFilter = new JTable(modelParametersFilter){
// Determine editor to be used by row
public TableCellEditor getCellEditor(int row, int column)
{
int modelColumn = convertColumnIndexToModel( column );
int modelRow = convertRowIndexToModel( row );
Parameter_Filter pf = view.listParameter_Filter.get(modelRow);
if(modelColumn == 2 && pf instanceof Parameter_Filter_To_List_Of_Fields) {
Parameter_Filter_To_List_Of_Fields pftlof = (Parameter_Filter_To_List_Of_Fields)pf;
JList<String> list = new JList<String>(pftlof.list_of_fields_total_names);
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
list.setLayoutOrientation(JList.VERTICAL_WRAP);
list.setVisibleRowCount(-1);
return new TableCellEditor() {
@Override
public boolean stopCellEditing() {
return false;
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return false;
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return true;
}
@Override
public Object getCellEditorValue() {
return list.getSelectedValuesList().toString();
}
@Override
public void cancelCellEditing() {
}
@Override
public void addCellEditorListener(CellEditorListener l) {
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return list;
}
};
}
return super.getCellEditor(row, column);
}
};
有什么建议么?
解决方案
我已经解决了我的问题。我一直无法在 Cell 上添加多项选择JComboBox
,或者一个可显示的。相反,我使用了一个显示. 这是代码:JList
Jtable
JOptionPane
JList
tableParametersFilter.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
JTable target = (JTable)e.getSource();
int row = target.getSelectedRow();
int column = target.getSelectedColumn();
if(column == 2){
Parameter_Filter pf = view.listParameter_Filter.get(row);
if(pf instanceof Parameter_Filter_To_List_Of_Fields) {
Parameter_Filter_To_List_Of_Fields pftlof = (Parameter_Filter_To_List_Of_Fields) pf;
JList<String> jlist = new JList<String>(pftlof.list_of_fields_total_names);
String StringOfIntArray = (String) tableParametersFilter.getValueAt( row, 2);
int[] list_parameter_id = Statique.StringOfIntArrayToIntegerArray(StringOfIntArray);
if(list_parameter_id.length < jlist.getModel().getSize()) {
int[] list_places = pftlof.getPlaceOfParameters(list_parameter_id);
for(int i = 0; i < list_places.length; i++) {
jlist.setSelectedIndices(list_places);
}
}
JScrollPane scrollPane = new JScrollPane(jlist);
scrollPane.setPreferredSize( new Dimension( 500, 500 ) );
JOptionPane.showMessageDialog(
null, scrollPane, "Multi-Select Example", JOptionPane.PLAIN_MESSAGE);
int[] SelectedIndices = jlist.getSelectedIndices();
Integer[] listParametersId = new Integer[SelectedIndices.length];
for(int i = 0; i < SelectedIndices.length; i++) {
int id = pftlof.list_of_fields_Total[SelectedIndices[i]].id;
try {
Parameter p = Parameter.getParameter(
id,
Parameter_Filter_To_List_Of_Fields.getTotal_Parameter_In_Parameter_Filter_To_List_Of_Fields());
listParametersId[i] = p.id;
} catch (NoSuchFieldException e1) {
e1.printStackTrace();
}
}
System.out.println(Arrays.toString(listParametersId));
tableParametersFilter.setValueAt(Arrays.toString(listParametersId), row, 2);
}
}
}
}
推荐阅读
- django - 如何结合 Django 内置的“with”标签使用自定义模板标签?
- javascript - 将额外未使用的日期字段添加到自定义类型时,测试会引发错误 TS2322 和 TS2769
- django - 如果输入不在选择中,则更改字段的值 Django ImportExportModelAdmin
- javascript - 如何通过解析过 json 的数组访问嵌套数据
- c# - ASP.NET MVC / C#:运行交换远程 PowerShell 代码不会删除中继条目
- azure-active-directory - 在隐身窗口中到处注销时,不调用前通道注销 URL
- amazon-cloudformation - SAM 创造新角色和新政策
- square - Square 礼品卡的付款流程(第 3 方)如何运作
- deployment - 如果前端应用程序在客户端浏览器中执行,那么部署前端应用程序意味着什么?
- sql - 对 SQL 表的批量更新不会停止