JScrollPane中的JTable:禁用滚动条的最佳高度

Nik*_*sov 2 java size swing jtable jscrollpane

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

JTable不会显示列标题

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);
Run Code Online (Sandbox Code Playgroud)

问题是我需要计算一个高度,JScrollPane这样整体JTable就可以看到而且JScrollBar不会出现.我怎样才能做到这一点?

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

kle*_*tra 8

基本方法是

  • JTable是一个Scrollable,遗憾的是在计算prefScrollable方面做得不好,所以你必须自己做
  • 要么使用一个LayoutManager来布局所有的pref(fi FlowLayout),要么在JTable中实现max(如果你使用一个调整大小但是最大的管理器,比如BoxLayout)
  • 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();
    }
};
Run Code Online (Sandbox Code Playgroud)