某些组件可以提供有关设置视口的首选大小的有用信息。该setVisibleRowCount()方法JList特别方便,但甚至getViewport().setPreferredSize(…)可能就足够了。当然,sscce会有所帮助。
附录:作为一个具体的例子,下面的对话框最初的大小为N -2行。随着越来越多的被添加,该对话框增长,直到数量达到Ñ。此时,滚动条开始“增长”。该示例使用a JList,但任何Scrollable组件都应该是可适应的。import java.awt.BorderLayout;import java.awt.EventQueue;import java.awt.event.ActionEvent;import javax.swing.AbstractAction;import javax.swing.DefaultListModel;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JList;import javax.swing.JPanel;import javax.swing.JScrollPane;/** @see http://stackoverflow.com/questions/5759131 */public class ListDialog {
private static final int N = 12;
private JDialog dlg = new JDialog();
private DefaultListModel model = new DefaultListModel();
private JList list = new JList(model);
private JScrollPane sp = new JScrollPane(list);
private int count;
public ListDialog() {
JPanel panel = new JPanel();
panel.add(new JButton(new AbstractAction("Add") {
@Override
public void actionPerformed(ActionEvent e) {
append();
if (count <= N) {
list.setVisibleRowCount(count);
dlg.pack();
}
}
}));
for (int i = 0; i
this.append();
}
list.setVisibleRowCount(N - 2);
dlg.add(sp, BorderLayout.CENTER);
dlg.add(panel, BorderLayout.SOUTH);
dlg.pack();
dlg.setLocationRelativeTo(null);
dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dlg.setVisible(true);
}
private void append() {
model.addElement("String " + String.valueOf(++count));
list.ensureIndexIsVisible(count - 1);
}
public static void main(String[] a_args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ListDialog pd = new ListDialog();
}
});
}}