【问题标题】:JScrollBar Vertical/Horizontal setting problem- Java SwingJScrollBar Vertical/Horizo​​ntal 设置问题-Java Swing
【发布时间】:2010-12-12 19:22:42
【问题描述】:

我只是想向我的 TextField 和 TextArea 添加一个垂直滚动条。 我正在使用 ScrollPane,它应该默认创建垂直/水平滚动条。

问题: 我需要一个垂直滚动条来查看不可见的数据。 开始时会出现一个垂直滚动条,但当数据增加时,垂直滚动条会变为水平滚动条。 TextField 也消失了,只有一个水平滚动条出现在它的位置。 我想这是因为我设置了界限,但我尝试更改界限,最终完全取消了 TextField。

我的代码sn-p:

public JTextField inputField = new JTextField();

public  JTextArea talkArea = new JTextArea();

public JScrollPane inputFieldScroll = new JScrollPane(inputField);

public JScrollPane talkAreaScroll = new JScrollPane(talkArea);
      talkArea.setEditable(false);

    talkArea.setBackground(Color.white);

     talkAreaScroll.setBounds(new Rectangle(TALK_LEFT, TALK_TOP, TALK_WIDTH, TALK_HEIGHT));     

     this.getContentPane().add(talkAreaScroll, null);

    //set input area

      inputField.setBackground(Color.white);

    inputField.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT));

    inputFieldScroll.setVerticalScrollBar(new JScrollBar());

    inputFieldScroll.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT));

问题:

我需要设置一些参数以使其保持垂直滚动条吗? 为什么当数据变成大行时,输入滚动条会占据整个输入域?它在开始时显示为适当的垂直滚动条。

任何建议表示赞赏。

谢谢

【问题讨论】:

  • 你能创建并发布一个小的可编译和可运行的例子吗?另外,如果您设置 JScrollPane 的 JViewport 的首选大小而不是 JScrollPane 本身,会发生什么?

标签: java swing jscrollpane jtextcomponent jscrollbar


【解决方案1】:

下面是我上面提到的一个小的可编译代码sn-p。我同意 camickr 的观点,即您不应该使用绝对定位,而应该使用布局管理器。如果您绝对需要 JTextField 的水平滚动条,那么让它工作的一种方法是让它始终显示,使用允许这样做的 JScrollPane 构造函数。即,

        JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

例如,

import java.awt.*;
import javax.swing.*;

public class FuSwing1b extends JPanel {
    private static final int TA_ROWS = 25;
    private static final int TA_COLS = 60;
    private JTextField inputField = new JTextField();
    private JTextArea talkArea = new JTextArea(TA_ROWS, TA_COLS);

    public FuSwing1b() {
        talkArea.setEditable(false);
        talkArea.setFocusable(false);
        talkArea.setBackground(Color.white);
        //talkArea.setPreferredSize(new Dimension(TALK_WIDTH, TALK_HEIGHT));

        JScrollPane talkPane = new JScrollPane(talkArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        int gap = 10;
        setLayout(new BorderLayout(gap, gap));
        add(talkPane, BorderLayout.CENTER);
        add(inputPane, BorderLayout.SOUTH);
        setBorder(BorderFactory.createEmptyBorder(gap , gap, gap, gap));
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("FuSwing1b");
        frame.getContentPane().add(new FuSwing1b());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}

【讨论】:

  • 如果你想让滚动条正常工作,你永远不应该设置文本区域的首选大小。当文本区域的首选大小大于滚动窗格的大小时,会出现滚动条。如果您硬编码文本区域的首选大小,则添加文本不会影响其首选大小。
  • 感谢建议和指正!你当然是对的。我将编辑上面的帖子以反映这一点。
  • 嗨.. 我试过这个:(inputField, JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_​​NEVER);我的滚动窗格的设置..但没有区别。当数据超过我的文本字段的大小时,最终得到了水平窗格。 :(
  • 再一次,如果你仍然卡住,创建一个小的可编译程序,我们可以运行、测试和修改,就像我上面发布的程序一样。
【解决方案2】:

不要玩弄边界。使用布局管理器,您就不必担心这个了。

当您创建文本字段时,请使用以下内容:

JTextField textField = new JTextField(10);

这将创建一个至少包含 10 个字符的文本字段。如果字符数超过文本字段的显示宽度,用户可以使用右/左箭头键查看剩余的字符。这是我见过的所有应用程序使用的正常 UI。不要尝试使用水平滚动条来创建自己的 UI。用户不习惯。

对于文本区域,您可以使用以下方法创建它:

JTextArea textArea = new JTextArea(5, 30);
JScrollPane scrollPane = new JScrollPane( textArea );

创建一个有 5 行且每行大约 30 个字符的文本区域。

现在“使用布局管理器”将文本字段和滚动窗格添加到框架中,然后打包框架。布局管理器将确定组件的最佳尺寸。当您向其添加文本并且文本超过 5 行时,滚动条将自动出现在文本区域上。

【讨论】:

    猜你喜欢
    • 2019-03-30
    • 2017-01-12
    • 2012-12-20
    • 2012-02-05
    • 1970-01-01
    • 2015-11-28
    • 2021-04-21
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多