我有一个面板,它被BoxLayout.X_AXIS
:分成两部分
public TabsPanel() {
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
add(createLeftPanel());
add(createRightPanel());
}
每个左面板和右面板都有以下结构:一个带有BorderLayout
的外面板和一个位于外面板的BorderLayout.CENTER
中的内面板,外面板依次具有BoxLayout.Y_AXIS
和从上到下的几个组件。右侧面板有JTextArea
,JScrollPane
作为其组件之一:
protected JPanel createRightPanel() {
JPanel pane = new JPanel();
pane.setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
JTextArea label = createLabel();
JScrollPane scroll = new JScrollPane(label);
scroll.setMaximumSize(new Dimension(500, 200));
panel.add(Box.createRigidArea(new Dimension(0,106)));
panel.add(scroll);
JPanel panel_buttons = new JPanel();
panel_buttons.setLayout(new BoxLayout(panel_buttons, BoxLayout.LINE_AXIS));
panel_buttons.setAlignmentX(Component.CENTER_ALIGNMENT);
Font font_text = new Font("Georgia", Font.PLAIN, 20);
JButton[] buttons = new JButton[2];
buttons[0] = new JButton("Clear");
buttons[1] = new JButton("Exit");
for (int i = 0; i < buttons.length; i++) {
buttons[i].setMaximumSize(new Dimension(120, 40));
buttons[i].setFont(font_text);
panel_buttons.add(buttons[i]);
if (i == 0)
panel_buttons.add(Box.createRigidArea(new Dimension(40, 0)));
buttons[i].addActionListener(new TextActionListener(label));
}
panel.add(Box.createRigidArea(new Dimension(0,20)));
panel.add(panel_buttons);
pane.add(panel, BorderLayout.CENTER);
return pane;
}
当文本超出边界时,会出现滚动条,我可以移动它们并阅读文本。看起来一切都很好,但当我单击滚动窗格外的任何位置,甚至只是移动指针时,滚动窗格会向左移动并向下增长。它不会改变宽度,但会向左移动,因为它和右侧面板边界之间的面积会增加。因此,左侧面板的尺寸缩小。当我清除文本区域并再次单击或移动指针时,它会恢复到正常大小。
它的高度增加,左右边缘增加的原因是什么?我做错了什么?
更新我发现问题了。问题是我没有正确创建JTextArea
。我在没有参数的情况下初始化了它:
JTextArea text = new JTextArea("Some initial text");
现在我重写了:
JTextArea text = new JTextArea(5,10);
它现在向左移动了大约5毫米,并且不改变它的高度。仍然不完美,但看起来我走在了正确的轨道上。
感谢大家的帮助!
-
接受Min、Max和PreferredSize的BoxLayout覆盖JPanel 的那些方法
-
使用JSPlitPane,可以隐藏分隔符
纠正的两个步骤:
- 设置JTextArea的大小:
JTextArea text = new JTextArea(row, col);
- 仍然向左移动垂直条的大小:
添加ChangeListener
以调整JScrollPane
的大小
scroll.getViewport().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (scroll.getVerticalScrollBar().isVisible())
scroll.setPreferredSize(480, 200);
}
}
});
或添加scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);