java - JScrollPane 内的 JTable : best height to disable scrollbars

标签 java swing jtable size jscrollpane

我使用以下代码在 JScrollPane 内创建 JTable 以显示列标题

JTable won't show column headers

String[] columnNames = {"header1", "header2", "header2", "header3"};
Object[][] data = new Object[num][4];
//feed values into data using for

JTable chart = new JTable(data, columnNames);
chart.setShowVerticalLines(false);
chart.setEnabled(false);
chart.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

JScrollPane sp = new JScrollPane(chart);
sp.setPreferredSize(new Dimension(width, chart.getHeight() + 5));
panel.add(sp);

问题是我需要计算 JScrollPane高度,以便整个 JTable 可见并且 JScrollBars 不会出现。我怎样才能做到这一点?

num 从 2 更改为 4,如果是 4,则会出现滚动条。 宽度是固定的。

最佳答案

基本方法是

  • JTable 是一个 Scrollable,不幸的是,它在计算 prefScrollable 方面做得不太好,所以你必须自己做
  • 要么使用 LayoutManager 来布局所有内容(例如 FlowLayout),要么在 JTable 中实现 max(如果您使用像 BoxLayout 这样的调整大小但尊重 max 的管理器)
  • JScrollPane 是一个validationRoot,因此重新验证必须发生在scrollPane 的父级上

类似于:

final JTable table = new JTable(10, 5) {

    @Override
    public Dimension getPreferredScrollableViewportSize() {
        Dimension dim = super.getPreferredScrollableViewportSize();
        // here we return the pref height
        dim.height = getPreferredSize().height;
        return dim;
    }

};
final JComponent content = new JPanel();
content.add(new JScrollPane(table));
Action add = new AbstractAction("add row") {

    @Override
    public void actionPerformed(ActionEvent e) {
        ((DefaultTableModel) table.getModel()).addRow(new Object[]{});
        content.revalidate();
    }
};

关于java - JScrollPane 内的 JTable : best height to disable scrollbars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13971089/

相关文章:

java - F5 规则与 RESTful 服务

java - 字符串修剪异常

java - 神经网络训练

java - 为什么从不更改接收更改事件的通知程序

java - 找到 JTable 单元格并绘制它

java - 为什么我必须输入 str.length()-3 ?请帮忙解释一下

java - 通过扩展 Rectangle 类以使用其 contains 和 intersects 方法来实现碰撞检测

java - 如何一个接一个地运行帧

java - 一个非常基本的 applet/swing 要求

java - 如何在编辑时更改 JTable 单元格文本?