java - 如何获取 JScrollPane 内(可更改)组件的完整大小?

标签 java size components jscrollpane

我的代码是这样的:

JFrame frame = new JFrame();

JPanel panel = new JPanel();

JTextPane text = new JTextPane();
text.setPreferredSize(new Dimension(200,260));
text.setContentType("text/html");
text.setEditable(false);
text.setText("some random thing makes this pane bigger than its perferred size");

JScrollPane scroll = new JScrollPane(text);

panel.add(scroll);

frame.add(panel);
frame.setVisible(true);
frame.pack();
frame.validate();

我的问题是我不知道如何获取JTextPane(此处的文本)的实际大小。我已经尝试了所有 getSizesgetVisibleRectsscroll.getViewport().getViewSize()...但它们都返回 [200,260]。有人可以帮我解决这个问题吗?我非常感谢您提供的任何帮助。

编辑:我发现了问题:在验证框架之前执行了我的 getSizes 请求。 我的可运行测试代码:

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;

public class Abcd {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    JFrame frame = new JFrame();

    JPanel panel = new JPanel();

    JTextPane text = new JTextPane();
    text.setPreferredSize(new Dimension(150,126));
    text.setContentType("text/html");
    text.setEditable(false);

    //Alicia Vikander's photo. She's cute anw.
    String tmp = "<a href=\"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Alicia_Vikander.jpg/220px-Alicia_Vikander.jpg\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Alicia_Vikander.jpg/220px-Alicia_Vikander.jpg\"/></a>";
    //text.setText("asdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sf");
    text.setText(tmp);
    JScrollPane scroll = new JScrollPane(text);
    scroll.setPreferredSize(new Dimension(150,126));

    panel.add(scroll);

    frame.add(panel);
    frame.setVisible(true);
    frame.pack();
    frame.validate();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    for (double i = 0; i < 1000; i = i +  0.0001){
        System.out.print(text.getHeight()+"\n");            
        if (text.getHeight()!=123){   //3 pixels for the scrollpane's border i guessed
            System.out.print("i = "+i+", height = "+text.getHeight());
            break;
        }
    }
}

在我的计算机中 i 约为 50 - 100。所以我的新问题是:我是否可以尽快获得实际大小,但仍确保框架经过验证? 非常感谢。

最佳答案

我强烈建议您开始使用不同的 Layout managers .

如果我对你的代码进行一些调整:

JFrame frame = new JFrame();

final JTextPane text = new JTextPane();
text.setContentType("text/html");
text.setEditable(false);
text.setText("some random thing makes this pane bigger than its perferred size");

final JScrollPane scroll = new JScrollPane(text);
scroll.addComponentListener(new ComponentAdapter()  {
        @Override
        public void componentResized(ComponentEvent e) {
            System.out.println("Size of JScrollPane is: " + scroll.getSize());
            System.out.println("Size of JTextPane is: " + text.getSize());
        }
});

frame.setLayout(new BorderLayout());
frame.add(scroll,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);

我们将获得调用其 scroll.getSize() 的滚动组件的大小和调用其 text.getSize() 的文本组件的大小

关于java - 如何获取 JScrollPane 内(可更改)组件的完整大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34534889/

相关文章:

delphi - 在组件的持久化中实现 `Auto` 属性

php - 如何创建可重用的 Twig 组件

java - AWS CloudWatchEvents PutRuleRequest 的问题

java - spring事务如何在包含3个dao方法调用的服务方法中创建

java - Google 的 Json 解析 Gson 库 : What's the difference between JsonElement and JsonObject?

java - 子类调用父类递归java

ANDROID:查找 SqliteDatabase 中各个表的大小

Java - 设置装饰 JFrame 的大小

javascript - Vue.js - child 组件通信

java - 为什么即使在设置 JPanel 的大小后,我的框布局也会更改大小