有
many reasons不使用setPreferredSize(),但这里的关键是所需的结果取决于所包含组件的首选大小.特别是,
> ChartPanel具有JPanel指定的默认FlowLayout,但图表忽略此项并调整以填充可用空间;您可以覆盖getPreferredSize()以选择任何所需的初始几何体.
>只有当视口的大小小于内容的大小时,才会显示JScrollPane的滚动条. BorderLayout.WEST和BorderLayout.EAST不会更改,因此滚动条永远不会出现.
调用pack()“会使此Window的大小适合其子组件的首选大小和布局.”在下面的示例中,在pack()之后人为地减小框架的大小,以便使滚动条出现. GridLayout导致两个面板的大小相等.调整框架大小以查看效果.
附录:如果您希望ChartPanel具有固定大小,请将其添加到JPanel;默认的FlowLayout使用首选大小.
public class ChartPanelTest {
private static final int N = 64;
private static final int SIZE = 400;
private static final Random random = new Random();
private static XYDataset createDataset() {
final TimeSeries series = new TimeSeries("Random Data");
Day current = new Day();
for (int i = 0; i < N; i++) {
series.add(current, random.nextGaussian());
current = (Day) current.next();
}
return new TimeSeriesCollection(series);
}
private static JFreeChart createChart(final XYDataset dataset) {
JFreeChart chart = ChartFactory.createTimeSeriesChart(
"Test", "Day", "Value", dataset, false, false, false);
return chart;
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setLayout(new GridLayout(1, 0));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JFreeChart chart = createChart(createDataset());
f.add(new JScrollPane(new JPanel() {
{
setBackground(Color.red);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(SIZE, SIZE);
}
}));
f.add(new ChartPanel(chart) {
@Override
public Dimension getPreferredSize() {
return new Dimension(SIZE, SIZE);
}
});
f.pack();
f.setSize(2 * (SIZE - N), SIZE - N);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}