【发布时间】:2012-02-29 01:06:01
【问题描述】:
我有一个包含大量文本字段的表单,其中一些文本字段可能包含很长的字符串。为了使它工作,我使用以下代码使这些文本字段可滚动:
JScrollPane scroll = new JScrollPane(textField);
scroll.setPreferredSize(new Dimension((int)textField.getPreferredSize().getWidth(), (int)textField.getPreferredSize().getHeight() * 2));
然后我使用 GridBagLayout 将滚动条放入表单中。
我的示例中的第二行是显示滚动条所必需的。但它有缺点。当我调整窗口大小以适应文本字段中的整个文本时,滚动消失让我只比其他文本字段高两倍,这看起来很荒谬。 隐藏滚动条后,如何使这一切正常工作并显示正常大小的文本字段?
编辑:
您可以使用以下演示代码来重现该问题:
import javax.swing.*;
import java.awt.*;
public class ScrollTextDemo extends JFrame{
public ScrollTextDemo(){
super();
this.setPreferredSize(new Dimension(500, 300));
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
JTextField textField = new JTextField("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
textField.setCursor(new Cursor(0));
textField.setEditable(false);
JScrollPane scroll = new JScrollPane(textField);
scroll.setPreferredSize(new Dimension(70, 40) );
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 0.5;
gbc.insets = new Insets(5, 5, 0, 5);
panel.add(scroll,gbc);
//let's add one more text field without scroll bar to compare
JTextField textField2 = new JTextField("abc");
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 2;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 0.5;
gbc.insets = new Insets(5, 5, 0, 5);
panel.add(textField2,gbc);
this.add(panel);
}
public static void main(String args[]){
ScrollTextDemo demo = new ScrollTextDemo();
demo.pack();
demo.setVisible(true);
}
}
【问题讨论】:
-
周围环境如何? IE。你把 JScrollPane 放在什么布局管理器的容器中?
-
JPanel 使用 GridBagLayout。
-
哦,对不起,它就在那里。您需要向我们展示布局配置,因为这决定了组件的大小和位置。
-
@GrayR 您是否考虑过始终显示滚动条?您可以通过在 JScrollBarPane 构造函数中传递 JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS 来做到这一点。这是一个可以接受的权衡吗?
-
“为了让它工作,我让这些文本字段可滚动” 默认情况下,文本字段是可滚动的。
标签: java swing jscrollpane jtextfield scrollable