Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JScrollPane中获得(可变)组件的完整大小?_Java_Size_Components_Jscrollpane - Fatal编程技术网

Java 如何在JScrollPane中获得(可变)组件的完整大小?

Java 如何在JScrollPane中获得(可变)组件的完整大小?,java,size,components,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

我的代码如下:

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
(此处的文本)的实际大小。我已经尝试了所有的
getSize
&
getVisibleRects
scroll.getViewport().getViewSize()
。。。但是他们都回来了。有人能帮我解决这个问题吗?我真的很感激你能提供的任何帮助

编辑:我发现了问题:我的
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;
        }
    }
}
导入java.awt.Dimension;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextPane;
公开课{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
JFrame=新JFrame();
JPanel面板=新的JPanel();
JTextPane text=新的JTextPane();
text.setPreferredSize(新维度(150126));
setContentType(“text/html”);
text.setEditable(false);
//艾丽西亚·维坎德的照片。她很可爱。
字符串tmp=“”;
//text.setText("自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻自攻f sd sdf sfasdf fssdfsdf sfdsdf sd sdf sf”);
text.setText(tmp);
JScrollPane scroll=新的JScrollPane(文本);
scroll.setPreferredSize(新维度(150126));
面板。添加(滚动);
框架。添加(面板);
frame.setVisible(true);
frame.pack();
frame.validate();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
对于(双i=0;i<1000;i=i+0.0001){
System.out.print(text.getHeight()+“\n”);
如果(text.getHeight()!=123){//3像素作为滚动窗格的边框,我猜
System.out.print(“i=“+i+”,height=“+text.getHeight());
打破
}
}
}
在我的电脑中,
i
大约是50-100。所以我的新问题是:我是否可以尽快得到真实尺寸,但仍然确保帧经过验证?
非常感谢。

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

如果我仔细检查一下你的代码:

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()的文本组件的大小。我强烈建议您开始使用不同的

如果我仔细检查一下你的代码:

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()的文本组件的大小

我运行测试时,您的测试实际上并没有改变
文本的大小,而是换行了。我将您的测试文本乘以50,然后它改变了大小,
text.getSize()
相应地改变了它的输出
,但它们都返回[200260]。
不要使用
setPreferredSize()
方法。谢谢大家。我终于找到了返回的原因
[200260]
而不是实际大小:
getSizes
请求是在框架验证之前完成的。我编辑了这个问题,给出了我的可运行示例(原来的示例有点小,我错了)。我现在的问题是如何确保在帧已验证时获得大小。再次感谢您的帮助。在我运行测试时,您的测试实际上并没有更改
文本的大小,而只是换行。我将测试文本乘以50,然后它更改了大小和
text.getSize()
相应地更改了它的输出
,但它们都返回[200260]。
不要使用
setPreferredSize()
方法。谢谢大家。我终于可以找到它们返回的原因了
[200260]
而不是实际大小:
getSizes
请求是在框架验证之前完成的。我编辑了这个问题,给出了我的可运行示例(最初的示例有点小,我的错误)。我现在的问题是如何确保在框架已经验证时获得尺寸。再次感谢您的帮助。我已经编辑了我的帖子(我的旧帖子太少了,是我的错误)。这是我的新帖子(真实)问题。希望你能帮我解决。再次感谢你的帮助helps@HaM.1不能真正理解你的循环???此外,你坚持不使用布局管理器……(请考虑使用它),因为如果组件重新调整大小,大小可能会有所不同,所以我会像示例中那样使用ComponentListener来了解它们的大小…我使用
for
循环,而不是timertask或其他东西来显示结果随时间的变化。我使用的代码实际上正在运行,大小确实发生了变化,但是
for
循环显示了我告诉我,我的下一行是在帧仍在验证时执行的。最终结果应该是
height=283
,但我只能在索引运行到50或某个值时才能得到它(
123
是原始高度,内部没有文本)我尝试使用布局管理器,但它没有多大帮助,所以我没有把它放入示例代码中。这不是真正正确的编码风格。考虑使用监听器示例验证,然后在显示之前执行,然后在组件显示的代码(CeanEntEnter e)(组件监听器)中执行代码。我编辑了我的帖子(我的旧的太微薄,我的错误)。这是我的新问题。希望你能帮我解决。再次感谢你的帮助helps@HaM.1你不能真正理解你的循环???此外,你坚持不使用布局管理器……(请考虑使用它),因为大小可以改变,如果组件被重新调整大小,我将用一个组件监听器作为例子来理解什么大小