gpt4 book ai didi

java - 根据 JTable 的列坐标定位组件

转载 作者:行者123 更新时间:2023-11-29 03:02:08 24 4
gpt4 key购买 nike

场景:用户选择一个表格文件进行分析,然后使用 JTable 在 GUI 中将其作为预览加载。我希望用户在分析之前对列进行注释,但我不能替换列标题,因为那样会造成混淆。


我现有的解决方案有效但非常粗糙,如您在屏幕截图中所见 enter image description here组合框下方的位置不是特别好,当列数增加到 20-30 或更多时,这会变得非常困惑。

目前 tabbedPane 有三个子面板,包括标签和按钮的顶部面板,包括组合框和表格的中间面板,以及具有分析按钮的底部面板。

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);

问题:

  1. 这是一个合理的设置吗?如果是这样,我怎样才能更好地定位我的组合框?
  2. 如果现有设计不是最优的,我如何改进它而无需重做整个设计?

我按照建议查看了[JTableHeader.getHeaderRect()][2] here但我不确定如何根据标题矩形的 x、y 坐标放置组合,因为它们位于不同的面板中。

最佳答案

注意 comboPanel 是一个具有默认 FlowLayoutJPanel 可能会有所帮助,它根据组合框的首选大小将组件居中.结果,它们在中间“聚集”在一起。一些替代方案:

  • 指定具有额外列的 GridLayout 并为检查列使用空组件。初始画面将对齐,但随后对列宽的更改会改变这一点。

    JPanel comboPanel = new JPanel(new GridLayout(0, annots.length + 1));
  • 使用显示的方法向每个相关标题添加一个组合框 here ,注意所提出的警告 here .

关于java - 根据 JTable 的列坐标定位组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34181812/

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