gpt4 book ai didi

java - 如何在jTable中的某个单元格上获取jComboBox?

转载 作者:行者123 更新时间:2023-11-30 07:38:37 25 4
gpt4 key购买 nike

我正在尝试从 jTable 的某个单元格中创建 jComboBox。如果在第 4 列的同一行上您有值“FN”,则您将在第 5 列上看到一个带有 3 个选项的 jComboBox(“SSAA-MM-JJ”、“SSAA/MM/JJ”、“SAAMMJJ”),但如果同一行第 4 列单元格的值不是“FN”,则第 5 列上的所有其他单元格必须保持不变。

我做错了什么?

这是我尝试过的:

package rdjcsv;

import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;

/**
*
* @author acucu
*/
class MyCellEditor extends AbstractCellEditor implements TableCellEditor {

DefaultCellEditor other = new DefaultCellEditor(new JTextField());
DefaultCellEditor checkbox = new DefaultCellEditor(new JComboBox(new Object[] {"abc"}));

private DefaultCellEditor lastSelected;

@Override
public Object getCellEditorValue() {

return lastSelected.getCellEditorValue();
}

@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
if(column == 4 && table.getValueAt(row, column-1).toString().contains("FN")){


if(row == 0) {
lastSelected = checkbox;
return checkbox.getTableCellEditorComponent(table, value, isSelected, row, column);
}
lastSelected = other;
return other.getTableCellEditorComponent(table, value, isSelected, row, column);
}
return other.getTableCellEditorComponent(table, value, isSelected, row, column);
}

}

还有电话:

String[] values = new String[] {"SSAA-MM-JJ", "SSAA/MM/JJ", "SAAMMJJ"};
TableColumn col = jTable1.getColumnModel().getColumn(4);
col.setCellEditor(new MyComboBoxEditor(values));
col.setCellRenderer(new MyComboBoxRenderer(values));

输出:jComboBox 位于第 5 列的每个单元格上。

enter image description here

最佳答案

您的图像显示的是单元格渲染器的输出,而不是单元格编辑器的输出,因为任何时候都应该只有一个单元格编辑器可见。您不希望渲染器看起来像 JComboBox,而是显示为文本、标签。这表明您的程序存在其他问题。

其他问题:

  • 上面的代码存在 NPE 风险,因为 lastSelected 在启动时可能为 null。
  • 为什么要检查该行 == 0?您是否仅对第一行使用 JComboBox 编辑器?
  • 如果仍然卡住,请发布您的最小示例程序,

例如我的:

import java.awt.BorderLayout;
import java.awt.Component;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;

@SuppressWarnings("serial")
public class ComboEditorEg extends JPanel {
private MyTableModel model = new MyTableModel();
private JTable table = new JTable(model);

public ComboEditorEg() {
for (int i = 0; i < 10; i++) {
String textA = i % 2 == 0 ? "SA" : "FN";
String textB = i % 2 == 0 ? "A" : "B";

Object[] row = new String[] { textA, textB };
model.addRow(row);
}

table.getColumnModel().getColumn(1).setCellEditor(new MyCellEditor());

setLayout(new BorderLayout());
add(new JScrollPane(table));
}

private static void createAndShowGui() {
ComboEditorEg mainPanel = new ComboEditorEg();

JFrame frame = new JFrame("ComboEditorEg");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
createAndShowGui();
});
}
}

@SuppressWarnings("serial")
class MyTableModel extends DefaultTableModel {
public static final String[] COL_NAMES = { "Foo 1", "Foo 2" };

public MyTableModel() {
super(COL_NAMES, 0);
}

@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
}

@SuppressWarnings("serial")
class MyCellEditor extends AbstractCellEditor implements TableCellEditor {

DefaultCellEditor other = new DefaultCellEditor(new JTextField());
DefaultCellEditor checkbox = new DefaultCellEditor(new JComboBox<String>(new String[] { "abc",
"def", "ghi" }));

private DefaultCellEditor lastSelected = other; // so it's not null

@Override
public Object getCellEditorValue() {

return lastSelected.getCellEditorValue();
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
int row, int column) {
if (table.getValueAt(row, column - 1).toString().contains("FN")) {
lastSelected = checkbox;
return checkbox.getTableCellEditorComponent(table, value, isSelected, row, column);
}
return other.getTableCellEditorComponent(table, value, isSelected, row, column);
}

}

关于java - 如何在jTable中的某个单元格上获取jComboBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35017239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com