gpt4 book ai didi

java - JTable 中 JComboBox 的可用性功能

转载 作者:行者123 更新时间:2023-12-01 23:50:28 25 4
gpt4 key购买 nike

我正在尝试构建一个表,其中包含 JComboBoxes 作为渲染器和编辑器组件。这大部分工作正常,但是有两件事我似乎无法解决。

  1. 在单元格之间按 Tab 键应使 JComboBox 处于 Activity 状态
  2. 点击下拉箭头应立即打开选项列表

关于 1,可编辑组合应将焦点放在嵌入的文本字段内,固定组合应允许向下箭头打开选项列表。

关于2,我发现这有时取决于当前 Activity 的其他单元格,但其他时候我必须双击。我无法使这种行为保持一致。

为了方便起见,我提供了一个清晰的示例(我相信)使用推荐的方法在 Jtables 中嵌入 JComboBox。

感谢您的建设性建议。

import java.awt.Component;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableCombos
{
public static void main(String[] args)
{
JFrame frame = new JFrame("Frame");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

AbstractTableModel model = new DefaultTableModel()
{
String[] columnHeaders = new String[]{"label", "combo-edit", "combo-fixed"};
Class<?>[] columnClasses = new Class<?>[]{String.class, Double.class, Double.class};
List<Object[]> data = new ArrayList<>();
{
data.add(new Object[]{"row 1", 1.0d, 2.0d});
data.add(new Object[]{"row 2", 2.0d, 3.0d});
}

@Override
public int getColumnCount()
{
return columnHeaders.length;
}

@Override
public boolean isCellEditable(int row, int column)
{
return column != 0;
}

@Override
public int getRowCount()
{
if (data == null) // race condition
return 0;
return data.size();
}

@Override
public Object getValueAt(int row, int column)
{
return data.get(row)[column];
}

@Override
public void setValueAt(Object aValue, int row, int column)
{
data.get(row)[column] = aValue;
}

@Override
public Class<?> getColumnClass(int column)
{
return columnClasses[column];
}

@Override
public String getColumnName(int column)
{
return columnHeaders[column];
}
};

JTable table = new JTable(model);
table.setSurrendersFocusOnKeystroke(true);

TableColumn c1 = table.getColumnModel().getColumn(1);
TableColumn c2 = table.getColumnModel().getColumn(2);

JComboBox<Double> editorComboEditable = new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d});
editorComboEditable.setEditable(true);
c1.setCellEditor(new DefaultCellEditor(editorComboEditable));
c2.setCellEditor(new DefaultCellEditor(new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d})));

final JComboBox<Double> rendererComboEditable = new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d});
rendererComboEditable.setEditable(true);
final JComboBox<Double> rendererComboFixed = new JComboBox<>(new Double[]{1.0d, 2.0d, 3.0d});
c1.setCellRenderer(new TableCellRenderer()
{
@Override
public Component getTableCellRendererComponent(JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
rendererComboEditable.setSelectedItem(value);
return rendererComboEditable;
}
});
c2.setCellRenderer(new TableCellRenderer()
{
@Override
public Component getTableCellRendererComponent(JTable t, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
rendererComboFixed.setSelectedItem(value);
return rendererComboFixed;
}
});

frame.getContentPane().add(new JScrollPane(table));

frame.pack();
frame.setVisible(true);
}
}

最佳答案

您的两个问题都可以通过重写 DefaultCellEditor#isCellEditable 方法并返回 true 来解决

您可能还需要将 JTable#setSurrendersFocusOnKeyrinkle 设置为 true

更新

简短的回答是“很困惑”。长答案是“非常困惑”

我不久前进行了“连续编辑”过程。基本上,我覆盖了 EnterTab 键绑定(bind)。

我所做的基本上是停止任何 Activity 的单元格编辑器,记下当前单元格,然后尝试查找下一个可编辑单元格,如果需要,则循环回到开头(单元格 0x0)。

当我找到可编辑单元格时,我调用 JTable#esitCellAt 开始编辑该单元格。

要使弹出窗口在单元格开始编辑时可见,您需要重写 JComboBoxaddNotify 方法,并使用 SwingUtilities#invokeLater ,设置弹出窗口可见

关于java - JTable 中 JComboBox 的可用性功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16381057/

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