Java Swing应用中的JTable设计指南

Java Swing应用中的JTable设计指南,java,swing,jtable,Java,Swing,Jtable,我在swing应用程序中遇到了一个非常棘手的设计问题。一般来说,我有一个JTable和一个JLabel来显示。标签就在桌子的正下方 当这两个组件的高度不超过阈值时,表格和标签显示正常。然后,这两个组件的高度将随着表中填写的记录数的增加而增加 当这两个组件的高度超过阈值时,我希望表中有一个滚动条,这两个组件的高度将是阈值 这种设计可能吗?这当然是可能的。将JTable放入JScrollPane中,设置滚动窗格的首选大小 并使用LayoutManager,允许将这两个组件放在彼此的下面(例如Bo

我在swing应用程序中遇到了一个非常棘手的设计问题。一般来说,我有一个
JTable
和一个
JLabel
来显示。标签就在桌子的正下方

  • 当这两个组件的高度不超过阈值时,表格和标签显示正常。然后,这两个组件的高度将随着表中填写的记录数的增加而增加
  • 当这两个组件的高度超过阈值时,我希望表中有一个滚动条,这两个组件的高度将是阈值

这种设计可能吗?

这当然是可能的。将
JTable
放入
JScrollPane
中,设置滚动窗格的首选大小

并使用
LayoutManager
,允许将这两个组件放在彼此的下面(例如
BorderLayout
)。所以在伪代码中

JPanel container = new JPanel( new BorderLayout() );

JTable table=...;
JScrollPane scroll = new JScrollPane( table );
scroll.setPreferredSize( xxx, xxx );
container.add( scroll, BorderLayout.CENTER );

container.add( new JLabel( "my label" ), BorderLayout.SOUTH );

如果需要,您可以调整滚动窗格的滚动条策略。

Swing layout在首选大小更改时不自动重新布局,您必须调用revalidate(最好使用TableModelListener检查行数是否已更改)。您还需要根据首选尺寸调整组件大小的布局,BorderLayout对边框中的组件(但不适用于中间的组件)执行此操作。对于不同的管理器,您需要GridBag或更好的Mig-/Form-或Table(第三方)布局


非常感谢您的回答。但是我不能使用sroll.setPreferredSize(XXX,XXX)方法,因为如果我在JTable大小不够大时使用此方法,那么标签将不会在JTable的正下方,也就是说,JTable和我的标签之间有一些空白。这就是我真正想要看到的!!非常感谢
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TestTableLayout {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JPanel panel = new JPanel(new BorderLayout());
                panel.setPreferredSize(new Dimension(400, 400));

                final DefaultTableModel model = new DefaultTableModel(0, 1);
                JTable table = new JTable(model) {
                    @Override
                    public Dimension getPreferredScrollableViewportSize() {
// view port size should be the same as the preferred size
// limited to the height threshold
                        Dimension size = super.getPreferredSize();
                        size.height = Math.min(size.height, 100);
                        return size;
                    }
                };

                new Timer(1000, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        model.addRow(new Object[] { "Extra row!" });
// trigger a relayout of the panel
                        panel.revalidate();
                        panel.repaint();
                    }
                }).start();

                panel.add(new JScrollPane(table), BorderLayout.PAGE_START);

                JLabel label = new JLabel("my label");
                label.setVerticalAlignment(JLabel.TOP);
                panel.add(label, BorderLayout.CENTER);

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(panel);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}