我的秋千应用程序中有一个非常困难的设计问题。一般来说,我有一个JTable
和一个JLabel
来显示。表格正下方是标签。秋千应用程序中的JTable设计指南
- 当这两个部件的高度不超过阈,则该表和标签显示为正常。随着表中记录的数量增加,这两个组件的高度将会增加。
- 当这两个组件的高度超过阈值时,我希望表格中有一个滚动条,这两个组件的高度将成为阈值。
这是设计可能?
我的秋千应用程序中有一个非常困难的设计问题。一般来说,我有一个JTable
和一个JLabel
来显示。表格正下方是标签。秋千应用程序中的JTable设计指南
这是设计可能?
Swing布局的滚动条政策不会自动重新排版时,首选大小的变化,你必须调用重新验证(最好使用TableModelListener来检查行数是否已更改)。您还需要一个根据其首选大小来设置组件大小的布局,BorderLayout可以为组件在边框中执行此操作(但不适用于中间的组件)。对于不同的管理器,您需要GridBag或更好的Mig-/Form-或表(第三方)布局
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);
}
});
}
}
这当然是可能的。将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);
如果需要,你可以调整滚动窗格
非常感谢您的回答。但是因为如果我用这个方法我不能用sroll.setPreferredSize(XXX,XXX)方法时,则JTable的尺寸还不够大,那么标签将不会在JTable的下方,也就是说,JTable和我的标签之间有一些空白区域。 – zwang
这真的是我想看的!!非常感谢 – zwang