java根据JTable的列坐标定位组件
场景:用户选择一个表格文件进行分析,然后使用JTable将其作为预览加载到GUI中。我希望用户在分析之前对列进行注释,但我不能替换列标题,因为那样会让人困惑
我现有的解决方案可以工作,但非常粗糙,正如您在下面的屏幕截图中看到的,组合框的定位不是特别好,当列数增加到20-30或更多时,这会变得非常混乱
当前选项卡窗格有三个子面板,顶部面板包括标签和按钮,中间面板包括组合框和表格,底部面板包含分析按钮
private void dataPreview(final String[][] data, String[] headers, final JTabbedPane comp) {
// Take care of column headers
if (headers.length == 0) {
headers = new String[data[1].length];
for (int i = 0; i < headers.length; i++)
headers[i] = "C" + i;
}
// Column annotations
final Dataset.ANNOT_TYPE[] annots = new Dataset.ANNOT_TYPE[headers.length];
final JComboBox<?>[] combos = new JComboBox[annots.length];
// the upper part of the panel
final PreviewPanel descPanel = new PreviewPanel(frame);
final ParamPanel paramPanel = new ParamPanel();
final JPanel upperContainer = new JPanel(new BorderLayout());
paramPanel.setVisible(false);
descPanel.setParamButtonAction(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean b = paramPanel.isVisible();
paramPanel.setVisible(!b);
}
});
upperContainer.add(descPanel, BorderLayout.NORTH);
upperContainer.add(paramPanel, BorderLayout.SOUTH);
// Define table model
DataPreviewTableModel model = new DataPreviewTableModel(data, headers);
final JTable table = new JTable(model);
table.getColumnModel().getColumn(0).setPreferredWidth(25);
table.setTableHeader(new JTableHeader(table.getColumnModel()){
//Implement table header tool tips.
private static final long serialVersionUID = -7015589028339208609L;
public String getToolTipText(MouseEvent e) {
java.awt.Point p = e.getPoint();
int index = columnModel.getColumnIndexAtX(p.x);
return table.getColumnName(index);
}
});
for(int i=0; i<headers.length; i++)
table.getColumnModel().getColumn(i).setMinWidth(60);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
// create the combo boxes for column annotation
final JPanel comboPanel = new JPanel();
comboPanel.setBorder(new EmptyBorder(3, 0, 3, 0));
comboPanel.add(new JLabel("Columns:"));
for (int i = 0; i < combos.length; i++) {
final JComboBox<?> box = new JComboBox<Object>(Dataset.ANNOT_TYPE.values());
final int colIndex = i;
box.setMinimumSize(new Dimension(60, box.getMinimumSize().height));
box.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
int colType = box.getSelectedIndex();
table.getColumnModel().getColumn(colIndex+1)
.setCellRenderer(new CellColorRenderer(colType));
table.repaint();
}
});
comboPanel.add(box);
combos[i] = box;
}
final JPanel middlePanel = new JPanel(new BorderLayout());
middlePanel.add(comboPanel, BorderLayout.NORTH);
middlePanel.add(new JScrollPane(table), BorderLayout.CENTER);
JPanel lowerPanel = new JPanel(new BorderLayout());
final JButton analyzeButton = new JButton("Analyze Dataset!");
lowerPanel.add(analyzeButton, BorderLayout.LINE_END);
final JPanel container = new JPanel(new BorderLayout());
container.add(upperContainer, BorderLayout.NORTH);
container.add(new JScrollPane(middlePanel), BorderLayout.CENTER);
container.add(lowerPanel, BorderLayout.SOUTH);
comp.addTab("Preview", container);
问题:
- 这是一个合理的设置,如果是这样,我如何才能更好地定位我的组合框李>
- 如果现有设计是次优设计,我如何改进它而不必重新进行整个设计李>
我按照建议查看了[JTableHeader.getHeaderRect()][2]
here,但我不确定如何根据标题矩形的x,y坐标放置组合,因为它们位于不同的面板中
# 1 楼答案
我基于
JTable
的TableColumnModel
创建了一个简单的布局。只需将组件添加到面板中,并指定组件应位于上方的列(如果将面板添加到表下方,则位于下方):组件将随着
TableColumn
的大小而增长/收缩构件将显示在列的左边缘。您可能希望修改该选项,使构件相对于柱居中
# 2 楼答案
注意
comboPanel
是一个具有默认JPanel
的FlowLayout
,它根据组合框的首选大小将组件居中。结果,他们在中间聚集在一起。一些备选方案:指定具有额外列的
GridLayout
,并为check列使用空组件。初始表格将对齐,尽管随后对列宽的更改将改变这一点使用here所示的方法向每个相关的头添加一个组合框,注意here中引用的注意事项