【问题标题】:Java Swing - How to put a JTable in a JScrollPane with MigLayout without issues?Java Swing - 如何使用 MigLayout 将 JTable 放入 JScrollPane 中而不会出现问题?
【发布时间】:2023-03-19 12:51:01
【问题描述】:

我正在尝试将 JTable 放入 JScrollPane 中,该 JScrollPane 位于设置为 MigLayout 的 JPanel 内。

当我插入表格时,我遇到了一些问题:

  1. 在列标题中添加到 JScrollPane 的标签总是丢失
  2. 表格对于几行来说太大了

这是一张不言自明的图片:

这里是我使用的简单代码:

private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(new MigLayout("", "[grow]", "[grow][grow]"));

    JPanel oh_Panel = new JPanel();
    frame.getContentPane().add(oh_Panel, "cell 0 0,grow");
    oh_Panel.setLayout(new MigLayout("", "[grow]", "[grow]"));

    JScrollPane oh_scrollPane = new JScrollPane();
    oh_Panel.add(oh_scrollPane, "cell 0 0,grow");

    JTree oh_tree = new JTree();
    oh_scrollPane.setViewportView(oh_tree);

    JLabel oh_label = new JLabel("MyLabel");
    oh_label.setHorizontalAlignment(SwingConstants.CENTER);
    oh_scrollPane.setColumnHeaderView(oh_label);

    JPanel panel = new JPanel();
    frame.getContentPane().add(panel, "cell 0 1,grow");
    panel.setLayout(new MigLayout("", "[grow]", "[grow][]"));

    JScrollPane scrollPane = new JScrollPane();
    panel.add(scrollPane, "cell 0 0,grow");

    table = new JTable(createTable());
    //table.setPreferredScrollableViewportSize(null);
    //table.setPreferredScrollableViewportSize(table.getPreferredSize());
    scrollPane.setViewportView(table);

    JLabel labelForTable = new JLabel("MyLabelForTable");
    scrollPane.setColumnHeaderView(labelForTable);

}


private DefaultTableModel createTable() {
    DefaultTableModel model = new DefaultTableModel();
    model.addColumn("Property");
    model.addColumn("Value");
    model.addRow(new String[]{"Name", "John"});
    model.addRow(new String[]{"Surname", "Red"});
    return model;
}

然后,我还尝试了我在其他问题中读到的解决方案,涉及:

table.setPreferredScrollableViewportSize(null); AND/OR
table.setPreferredScrollableViewportSize(table.getPreferredSize());

结果总是这样:

我什至尝试将 MigLayout 更改为 BorderLayout,但没有任何改变。

我错过了什么吗?

【问题讨论】:

  • 为了进行实验,将 JScrollPane 和 JTable 的背景颜色设置为不同的颜色。我是new JScrollPane(table) 类型的编码员,但应该是一样的。您可能需要使用表格大小作为滚动窗格的大小。
  • 既然您确定在使用 MigLayout 或 BorderLayout 时遇到同样的问题,那么您发布的代码应该是 BorderLayout 版本,因为 MigLayout 是第三部分类。问题应该首先通过使用JDK的类来解决,以确保问题不在其他类。
  • 发布minimal reproducible example 来证明问题。

标签: java swing jtable jscrollpane miglayout


【解决方案1】:

这与所涉及的布局管理器无关。它与 JTable 和 JScrollPane 之间的交互有关。

JTable 添加到JScrollPane 的视口时,JTableJTableHeader 将用作滚动窗格的列标题。但是,在使框架可显示之前,不会设置列标题。也就是说,它是在框架上调用 pack() 或 setVisible(true) 之后添加的。因此,您设置列标题的尝试将被覆盖。

如果您想使用自己的列标题,那么最简单的方法是使用两个组件创建自己的面板:

JLabel labelForTable = new JLabel("MyLabelForTable");
JTable table = new JTable(3, 2);
JPanel tableWrapper = new JPanel( new BorderLayout() );
tableWrapper.add(labelForTable, BorderLayout.PAGE_START);
tableWrapper.add(table, BorderLayout.CENTER);
JScrollPane scrollPane = new JScrollPane( tableWrapper );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2018-05-08
    • 2017-12-28
    • 1970-01-01
    • 2014-07-16
    • 2013-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多