【问题标题】:JScrollPane doesn't workJScrollPane 不起作用
【发布时间】:2013-11-15 13:36:04
【问题描述】:

我的 JScrollPane 在 JTextArea 附近:

    ...
    errorText = new JTextArea();
    errorText.setLineWrap(true);
    errorText.setWrapStyleWord(true);
    errorText.setPreferredSize(new Dimension(300, 150));

    JScrollPane scrollPane = new JScrollPane(errorText);
    scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scrollPane.setBorder(BorderFactory.createTitledBorder("Info Area"));
    ...

以及将文本添加到 errorText 的代码:

public void setText(String mes) {
    e140TEST2.errorText.append(lineNum + ".   " + mes + "\n");
    lineNum++;
}

添加一些行数后(当文本的高度高于 JTextArea 时),JScrollPane 不起作用(文本不滚动)。可以是什么??

【问题讨论】:

  • scrollpane 滚动内容而不是文本,它需要一个视口来应用可见区域。
  • 如果您还需要设置文本区域的像素大小,我的回答可能会有所帮助。

标签: java swing jscrollpane jtextarea preferredsize


【解决方案1】:

errorText.setPreferredSize(new Dimension(300, 150));

不要硬编码文本区域(或任何组件)的首选大小。添加/删除文本时首选大小会发生变化。

改为创建您的文本区域,例如:

textArea = new JTextArea(5, 30);

提供初始大小。

【讨论】:

  • 很好的答案,我迟到了
  • 虽然你的回答是正确的,但我认为你犯了同样的错误,你指出恕我直言:你不是也硬编码尺寸,只是使用不同的单位(行和列)?如果文本区域的大小由于图形设计限制而必须以像素为单位设置怎么办?只是出于好奇。
  • @hqcasanova,不敢相信你投了反对票。这是正确的做法。所有这些都是向文本区域“建议”一些作为首选大小的基础的值。然后,文本区域将考虑使用的字体(每个 LAF 可能不同)。许多 Swing 组件都有这个概念。使用文本字段,您还可以指定列数。使用 JList,您可以指定可见行数。如果您确实需要以像素为单位的大小,则覆盖 getPreferredSize() 方法以返回您的尺寸。
  • @camickr 感谢您的评论。是的,我确实对您的回复投了反对票,因为您只是顺便提到了为什么 OP 不应该对这些维度进行硬编码。当然,我同意这不是理想的解决方案。不幸的是,您可能从其他开发人员那里获得的代码并不总是理想的。或许这就是 OP 所处的情况。另外,我相信您知道我们来这里是为了学习和教学,而不是lecture。因此,与其说“不要硬编码[...]”,我更愿意说“你应该避免硬编码”并解释原因。当然,如果您按照这些思路编辑您的答案,我很乐意投票。
  • @hqcasanova,当答案错误或具有误导性时,会进行否决。我的回答没有任何错误或误导性。我们没有义务编写解释答案的教程。人们在喜欢答案时投票。如果我的回答不符合您的投票标准,那很好,但不要将您的标准强加于其他人。注意第一条评论是nice answer!
【解决方案2】:

虽然不是理想的解决方案,但如果您使用 JTextPane 实例而不是 JTextArea 实例,您仍然可以设置首选像素大小并保留滚动功能。另外,JTextPane 自动换行并在字边界处这样做(这似乎是您所追求的)。尝试以下 SSCCE:

import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.ScrollPaneConstants;

public class PaneWithScroll {
    public static void main (String[] args) {
        JTextPane errorText = new JTextPane();
        //errorText.setLineWrap(true);       
        //errorText.setWrapStyleWord(true);         
        errorText.setPreferredSize(new Dimension(300, 150));

        JScrollPane scrollPane = new JScrollPane (errorText);
        scrollPane.setVerticalScrollBarPolicy 
                          (ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        scrollPane.setBorder (BorderFactory.createTitledBorder("Info Area"));

        JFrame frame = new JFrame();
        frame.add (scrollPane);
        frame.pack();
        frame.setVisible (true);
    }
}

我应该补充一点,这可以作为一个快速补丁。但是,最佳实践要求您始终尝试将可能依赖于平台的规范与您的 GUI 设计分离。在这种情况下,绝对尺寸。

希望有帮助!

【讨论】:

  • frame.pack() 是什么?
  • @AndrewEvt 看看如果你把它拿出来会发生什么。每当您在 JFrame 的组件上设置首选大小时,最好让 Java 确定该 JFrame 的最小大小应该是多少,以便其所有组件都显示。这就是pack() 所做的。除非,也就是说,您希望框架大于最小尺寸(例如,在最大化的窗口中)。 Oracle's tutorial 可能会对您有所帮助。编码愉快!
  • 不,您不应该使用setPreferredSize() 方法。不要相信我的话,在论坛中搜索(尤其是来自 kleopatra - SwingX 设计师的评论)以了解其他人的观点。 JTextArea 支持自动换行并且比 JTextPane 更有效。仅当您确实需要 JTextPane 支持的功能(如不同的字体、颜色等)时才应使用 JTextPane。顺便说一下,它不是一个合适的 SSCCE,因为所有 Swing 组件都应该在 EDT 上创建。
  • @camickr 同样,有时你必须抛开纯粹主义,做一个快速而肮脏的补丁。这不同于说你总是可以使用同一个补丁,我不是。另外,JtextArea 比 JtextPane 更有效吗?我不敢苟同。当然,OP 可能永远不需要任何样式功能,但这不会损害解决方案的效率。它甚至使它更加灵活。最后,SSCCE 中的“正确”什么时候代表“完美”?完美可能会损害简单性。在这种特殊情况下,Swing 提供的最小线程安全已经绰绰有余。再次感谢。
  • 我们中的许多人多年来一直在回答问题。我们每天都会看到相同的问题/问题。其中许多问题是因为人们复制了在论坛上找到的旧代码。看看所有的top swing users。因此,我们提倡适当的做法,以尽量减少未来的潜在问题。
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多