Java Swing框架添加滚动条异常:单独运行正常,嵌入后文本域消失
问题描述
- 单独运行示例代码时,带滚动条的文本域显示正常;但将代码整合到已有框架的任务区域时,文本域消失。
- 正常运行的示例使用
FlowLayout布局,出现问题的场景使用null布局(无法替换,因为框架内原有组件需要手动移动)。 - 尝试的核心代码:
创建组件的代码:
启动代码:createAndShowGUI() { // JTextArea textArea = new JTextArea(20, 20); JScrollPane scrollableTextArea = new JScrollPane(textArea); scrollableTextArea.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); frame.getContentPane().add(scrollableTextArea); //} }javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } });
解决方案
方案1:给JScrollPane手动设置边界(适配null布局)
null布局下,所有组件必须手动指定位置和大小,否则组件会因默认尺寸为(0,0)而不可见。添加setBounds方法即可解决:
createAndShowGUI() { JTextArea textArea = new JTextArea(20, 20); JScrollPane scrollableTextArea = new JScrollPane(textArea); scrollableTextArea.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); // 根据你的任务区域调整坐标(x,y)和尺寸(width,height) scrollableTextArea.setBounds(50, 50, 300, 400); frame.getContentPane().add(scrollableTextArea); }
方案2:混合布局(不改动原有组件的前提下使用布局管理器)
如果不想手动设置边界,可以在任务区域单独创建子容器,给子容器设置合适的布局,再把滚动面板加入其中,原有组件仍保留在null布局的根容器中:
createAndShowGUI() { // 创建子容器存放滚动面板,使用FlowLayout自动布局 JPanel taskPanel = new JPanel(new FlowLayout()); // 设置子容器的位置和大小,对应你的任务区域 taskPanel.setBounds(50, 50, 300, 400); JTextArea textArea = new JTextArea(20, 20); JScrollPane scrollableTextArea = new JScrollPane(textArea); scrollableTextArea.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); taskPanel.add(scrollableTextArea); frame.getContentPane().add(taskPanel); }
这种方式下,原有组件的位置不受影响,新添加的滚动面板在子容器中由布局管理器自动处理显示,滚动条可正常工作。
问题根源
null布局不会自动计算和设置组件的大小与位置,组件默认无尺寸所以“消失”;而FlowLayout会根据组件的首选尺寸自动布局,因此能正常显示。
内容的提问来源于stack exchange,提问作者Ddll
相关产品推荐
相关产品推荐

