我有一个面板布局问题,我似乎无法解决。我有以下代码:
public class Test extends ApplicationFrame {
public Test(String title) {
super(title);
JPanel jpanel = new JPanel();
jpanel.setPreferredSize(new Dimension(100 * 2, 300));
jpanel.setBackground(new Color(0xFF0000));
JScrollPane scrollPane = new JScrollPane(jpanel);
scrollPane.setBackground(new Color(0xFF0000));
scrollPane.getViewport().setPreferredSize(new Dimension(100 * 2, 300));
this.add(scrollPane, BorderLayout.WEST);
this.setPreferredSize(new Dimension(500, 500));
}
public static void main(String args[]) {
Test test = new Test("Layout Test");
test.pack();
RefineryUtilities.centerFrameOnScreen(test);
test.setVisible(true);
}
}
创建以下布局:
当我拖动窗口的右侧并将其移动到红色JPanel
和JScrollPane
时,我希望水平滚动条显示在JScrollPane
上。但是目前窗口只是收缩而没有显示水平滚动条。这可能吗?
我想保留BorderLayout.WEST
,因为我的用例是为了在没有足够大的图表来填充整个窗口时保持JFreeChart不会拉伸。
答案 0 :(得分:7)
有many reasons不使用setPreferredSize()
,但这里的关键是所需的结果取决于所包含组件的首选大小。特别是,
ChartPanel
具有FlowLayout
指定的默认JPanel
,但图表会忽略此项并调整以填充可用空间;您可以覆盖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);
}
}
答案 1 :(得分:0)
可以做到。你可以声明三个JPanel。 一个JPanel是一个contentPanel whit BorderLayout。 设置在您想要滚动条的JPAnel的preferedSize和maximumSize 创建一个jscroolpane及其完成: 伪代码:
JPanel contentPanel = new JPanel(new BorderLayuout());
JPanel jpanel1 = new JPanel(layout--);
JPanel jpanel2 = new JPanel(layout--);
jpanel2.setPreferredSize(..);
jpanel2.setMaximuSize(..);
JScrollPane jsp = new JScroolPane(jpanel2);
contentPanel.add(jpanel1,BorderLayout.WEST);
contentPanel.add(jsp,BorderLayout.CENTER);
this.getContentPane().add(contentPanel);
在我的示例中,滚动条位于中心。 如果你想改变
contentPanel.add(jsp,BorderLayout.WEST);
contentPanel.add(jpanel1,BorderLayout.CENTER);