【问题标题】:JTable ComboBox loses value when clicked elsewhere在其他地方单击时,JTable ComboBox 失去价值
【发布时间】:2023-03-22 15:03:01
【问题描述】:

我为JTable 单元格设置了jComboboxDefaultCellEditor

当我在单元格 (jCombobox) 中键入一个值时出现问题,并且每当我单击其他位置时,该值都会丢失。有人知道为什么以及如何解决这个问题?

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

public class SpringJobTablePopupCellEditor extends AbstractCellEditor implements TableCellEditor {

    JTextField jtf;

    DefaultCellEditor other;
    DefaultCellEditor checkbox;
    private DefaultCellEditor lastSelected;
    JComboBox cbox = null;
    public SpringJobTablePopupCellEditor() {
        jtf = new JTextField();
        jtf.setDocument(new JTextFieldLimit(1000));

        other = new DefaultCellEditor(jtf);
        checkbox = new DefaultCellEditor(generateBox("10"));
    }

    @Override
    public Object getCellEditorValue() {
        return lastSelected.getCellEditorValue();
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    final JTable t = table;
    cbox.getEditor().getEditorComponent().addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent e) {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }

        @Override
        public void focusLost(FocusEvent e) {
            if(t.isEditing()){
                t.getCellEditor().stopCellEditing();
            }
        }
    });
        String val = table.getModel().getValueAt(row, column - 1).toString();

        if("ak".equals(val)){
            lastSelected = checkbox;
            return checkbox.getTableCellEditorComponent(table, value, isSelected, row, column);
        }
        lastSelected = other;
        return other.getTableCellEditorComponent(table, value, isSelected, row, column);
    }

    private JComboBox generateBox(String type) {

        cbox = new JComboBox();
        cbox.setEditable(true);
        for (Map.Entry<String, String> entry : SpringJob.akMap.entrySet()) {
            cbox.addItem(entry.getValue());
        }
        return cbox;
    }

}

【问题讨论】:

  • 如果我没记错的话,表格编辑器失去焦点的默认行为是取消编辑
  • 同时验证你对setValueAt()的实现。

标签: java swing jtable jcombobox


【解决方案1】:

试试

JTable table = new yourTable();
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

当您从一个组合框转到另一个组合框时,您需要强制表格停止编辑 我通过向组合框添加焦点监听器和在焦点丢失添加中实现了类似的效果

public void focusLost(FocusEvent e) {
    if (table.isEditing())
        table.getCellEditor().stopCellEditing();        
    }
}

【讨论】:

  • 没用!我在组合中输入了一个值,然后单击下面的单元格,组合的值设置为默认值(空)。
  • 正确,表格没有失去焦点,所以额外的属性没有帮助。
  • 对我来说没有任何改变!
【解决方案2】:

组合框正常存储了多个项目列表。当您单击 jtable 中的 JCombo 框并键入它不会直接添加到组合框列表项中的值时。您必须首先在组合框中添加价值。组合框包含对象数组。

试试这段代码,它在 Jtable 组合框中动态添加值

static JComboBox combo = new JComboBox();
static JTable table = new JTable();
public static void main(String[] args) 
{

    JFrame frame = new JFrame();

    JPanel topPanel = new JPanel();
    JPanel middlepanel = new JPanel();

    combo.addItem("First");
    combo.addItem("Second");
    combo.addItem("Third");

    JButton button = new JButton("Add Item");
    topPanel.add(button);        
    frame.setLayout(new BorderLayout());
    frame.setSize(500, 500);
    frame.add(topPanel, BorderLayout.NORTH);

    DefaultTableModel model = (DefaultTableModel) table.getModel();
    model.addColumn("A", new Object[] { "item1" });
    middlepanel.setLayout(new BorderLayout());
    middlepanel.add(table,BorderLayout.CENTER);
    String str[] = new String[combo.getItemCount()];
    for(int i=0;i<combo.getItemCount();i++){
        str[i] = combo.getItemAt(i).toString();
    }
    table.getColumnModel().getColumn(0).setCellEditor(new MyComboBoxEditor(combo));
    table.getColumnModel().getColumn(0).setCellRenderer(new MyComboBoxRenderer(str));
    table.setRowHeight(25);

    frame.add(middlepanel,BorderLayout.CENTER);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand();
            switch(cmd)
            {
                case "Add Item":
                    combo.addItem("Fourth");
                    combo.addItem("Fifth");
                    String str[] = new String[combo.getItemCount()];
                    for(int i=0;i<combo.getItemCount();i++){
                        str[i] = combo.getItemAt(i).toString();
                    }
                    table.getColumnModel().getColumn(0).setCellEditor(new MyComboBoxEditor(combo));
                    table.getColumnModel().getColumn(0).setCellRenderer(new MyComboBoxRenderer(str));
                    break;
            }
        }
    });
}

@Override
public void actionPerformed(ActionEvent e) 
{

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多