JScrollPane 和 JViewport 最大尺寸小于内容的滚动限制

2023-12-08

我有一个JFrame含有一个JScrollPane含有一个JPanel. The JPanel包含一堆JTextAreas。 我正在向其中加载大量文本(大约 8k-10k 个字符)。

布局工作正常,尽管滚动有点滞后。

真正的问题似乎是JPanel, JScrollPane and JViewport有一个硬性的 32767 大小限制,所以当任何JTextArea如果超过该值,则无法进一步滚动以显示文本的最后 1/3。

下面您可以看到该问题的一个最小示例。我用的是NetBeansJFrame设计师所以它可能有点长,但我对默认值唯一改变的是JTextAreas 是 的直接子代JPanel、滚动条策略以及稍大的字体大小:

public class NewJFrame extends javax.swing.JFrame {

/**
 * Creates new form NewJFrame
 */
public NewJFrame() {
    initComponents();
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jPanel1 = new javax.swing.JPanel();
    jTextArea1 = new javax.swing.JTextArea();
    jTextArea2 = new javax.swing.JTextArea();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

    jTextArea1.setColumns(20);
    jTextArea1.setFont(new java.awt.Font("Monospaced", 0, 14)); // NOI18N
    jTextArea1.setRows(5);

    jTextArea2.setColumns(20);
    jTextArea2.setFont(new java.awt.Font("Monospaced", 0, 14)); // NOI18N
    jTextArea2.setRows(5);
    jTextArea2.setText("Some long text...");

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addComponent(jTextArea1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jTextArea2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(0, 0, 0))
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jTextArea1, javax.swing.GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE)
                .addComponent(jTextArea2))
            .addGap(0, 0, 0))
    );

    jScrollPane1.setViewportView(jPanel1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jScrollPane1)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 96, Short.MAX_VALUE)
    );

    pack();
}// </editor-fold>                        

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    final NewJFrame f = new NewJFrame();
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for(javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels())
            if("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
    }catch(ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }catch(InstantiationException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }catch(IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }catch(javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            f.setVisible(true);
        }
    });
    StringBuilder txt = new StringBuilder();
    for(int i=0; i<10000; i++)
        txt.append(i).append("\n");
    f.jTextArea1.setText(txt.toString());
    txt = new StringBuilder();
    txt.append("JTextArea height: ").append(f.jTextArea1.getHeight()).append('\n');
    txt.append("JTextArea rows: ").append(f.jTextArea1.getRows()).append('\n');
    txt.append("JScrollPane height:").append(f.jScrollPane1.getHeight()).append('\n');
    txt.append("JViewport height:").append(f.jScrollPane1.getViewport().getHeight()).append('\n');
    txt.append("JPanel height:").append(f.jPanel1.getHeight()).append('\n');
    f.jTextArea2.setText(txt.toString());
}
// Variables declaration - do not modify                     
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextArea jTextArea2;
// End of variables declaration                   
}

如果运行此命令并滚动到底部,您预计会看到计数达到 10 000,但实际上只达到 1637,并且您可以看到下一行的顶部像素几乎没有显示。

我已经尝试过setMaximumSize and setSize on the JPanel, the JScrollPane和它的JViewport但一切都没有改变。我还有些困惑的是,尽管有 10k 行文本,其中一些可以滚动到足以查看,但getRows() and getSize()方法返回原始值。

当我想要可滚动的情况时,处理这种情况的正确方法是什么JTextArea大于 32767?


您的示例未正确同步,因为它更新了jTextArea2 on the 初始线程。注意JTextArea#setText()不再是线程安全的。下面的例子调用EditorKit#read(),按照建议here,加载所检查的相同 27 MB、176 K 行文件here。这需要几秒钟的时间,大约是JTable方法,但滚动是可比的。

import java.awt.EventQueue;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * @see https://stackoverflow.com/a/25691384/230513
 */
public class Test {

    private static final String NAME = "/var/log/install.log";

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTextArea text = new JTextArea(24, 32);
        try {
            text.read(new BufferedReader(new FileReader(NAME)), null);
        } catch (IOException ex) {
            ex.printStackTrace(System.err);
        }
        f.add(new JScrollPane(text));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new Test().display();
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JScrollPane 和 JViewport 最大尺寸小于内容的滚动限制 的相关文章

随机推荐

  • CMAKE 中添加 -fPIC 编译器选项的惯用方法是什么?

    我至少遇到过 3 种方法来做到这一点 我想知道哪种方法是惯用的 这几乎需要对任何静态库普遍完成 我很惊讶 CMake 中的 Makefile 生成器不会自动将其添加到静态库中 除非我错过了什么 target compile options
  • IValueConverter 的异步实现

    我有一个异步方法 我想在一个内部触发IValueConverter 有没有比通过调用强制同步更好的方法Result财产 public async Task Convert object value Type targetType objec
  • Python 2.6 与 2.7 中的浮点行为

    所以我打开了 Python 2 6 解释器 得到了这个 Python 2 6 6 r266 84292 Nov 22 2013 12 16 22 GCC 4 4 7 20120313 Red Hat 4 4 7 4 on linux2 Ty
  • Angular 的 Promise 是异步的吗?

    我可能错过了有关 Angular 承诺的一些内容 但我想知道一些事情 承诺是异步的吗 我不确定 异步 这个词是否正确 但让我解释一下 在我的代码中 我使用 Promise 执行一个非常大的过程 读取和写入数百个大文件 同时显示加载栏以观察该
  • Java:将两个json对象与主键合并在一起

    假设内存中有两个 JSONObject 数组 每个对象都有一个在两个数组中相似的键 Array 1 name Big Melons Co location Inner City Dubai id 1A name Pear Flavored
  • Jenkins - 如何构建特定分支

    这并不像仅仅进行参数化构建那么简单 我已经有了一个特定的构建过程 每当这些分支被推送到 GitHub 时就会构建和部署 所以如果我刚刚推动develop它构建成功 我如何触发手动构建并将其拉出feature my new feature 不
  • 检查字符串中是否有坏词? [复制]

    这个问题在这里已经有答案了 可能的重复 测试字符串中某些单词的有效方法 我想检查一个字符串是否包含以下任何单词 禁令 不良 用户 通行证 堆栈 名称 html 如果它包含任何单词 我需要回显坏单词的数量 str Hello my name
  • 阻止 Tumblr 将 JS 和 CSS 文件添加到主题中

    Tumblr 的博客中充斥着大量的 JS 和 CSS 文件 我不知道这些文件是否是必需的或只是有用 这是其中的列表 JS tumblelog js 和 pre tumblelog js gt 看起来这是 Tumblr JS API 但我们需
  • 如何停止 Swing 中重复的 keyPressed() / keyReleased() 事件

    所以我遇到的问题似乎是仅在 Linux 上发生的错误 我试图让我的摇摆应用程序记录按下某个键的时间 然后检测该键何时被释放 现在这不应该成为问题 因为按键监听器应该为我处理这个问题 问题是 当我按住按键时 我会收到大量重复的 keyPres
  • 如何在元组中单独添加元素?

    如何在元组中单独添加元素 例如 我需要 2 4 from 0 1 2 3 我一直这样做 但是有没有更Pythonic 更简洁的方法来做同样的事情 gt gt gt x 0 1 gt gt gt y 2 3 gt gt gt x y 0 1
  • SQLite:sqlite3.dll 与 System.Data.SQLite.dll?

    我需要使用什么SQLite 与 NHibernate and FluentNHibernate 有 系统 Data SQLite dll and 系统 Data SQLite Linq dll ADO NET 2 0 提供程序 可从http
  • Angular2 使用标签更新 ng2-charts

    这些天我开始工作Angular2 并对框架有疑问ng2 图表 这是我的组件 ts code import Component from angular core import ChartsModule from ng2 charts imp
  • std::numeric_limits 作为条件

    有什么方法我可以使用std numeric limits
  • 通过 extravars 将主机名传递给 ansible playbook

    我必须通过额外的变量传递将在其上执行 Ansible 命令的主机 我事先不知道任务将应用到哪些主机 因此 我的清单文件当前缺少hosts 多变的 如果我从文章中理解 如何将额外变量传递给 Ansible playbook 正确地说 只有已经
  • 共享元素过渡 + Fragment + RecyclerView + ViewPager

    我正在实现一个图库应用程序 它有一个片段 其中包含带有图像的 RecyclerView 单击图像时我会转到 ViewPager 循环浏览图像 现在 我正在尝试仅实现入口动画 如this视频 问题是动画不起作用 我显然错过了一些东西 只是显示
  • 异常如何转移并找到处理程序?

    当引发异常时 将启动堆栈展开 直到遇到处理代码 但我对整个过程的机制有点不清楚 1 异常存储在哪里 我并不是指实际的异常对象 它可能很大 例如有一个消息字符串或其他东西 但如果您愿意的话 也可以是实际的引用或指针 它必须是某个统一的存储位置
  • Xcode 4 数据模型版本控制错误?

    安装了 Xcode 4 一切似乎都很好 除了 当我尝试向核心数据模型添加版本控制时 在说明中 它说我应该在导航器中选择数据模型 然后 选择编辑器 gt 转换为版本化模型 好吧 编辑器 菜单没有 转换为版本化模型 项目 跳过这一步会使 Xco
  • APPX Windows 应用商店包可以包含多个“应用程序”吗?

    我试图更好地理解 APPX 包的 appxmanifest 文件 我注意到它有一个
  • 在“沙盒环境”中从 .Net 应用程序加载程序集

    I am 目前正在开发一个应用程序用户将动态选择 dll 应用程序将执行该 dll 中的一些方法 如果您点击第一个链接 您会看到我正在开发一种Robocode使用 Net Framework的游戏应用程序 例如 当战斗开始时 run执行 d
  • JScrollPane 和 JViewport 最大尺寸小于内容的滚动限制

    我有一个JFrame含有一个JScrollPane含有一个JPanel The JPanel包含一堆JTextAreas 我正在向其中加载大量文本 大约 8k 10k 个字符 布局工作正常 尽管滚动有点滞后 真正的问题似乎是JPanel J