gpt4 book ai didi

java - .getSize() 在 JScrollPane 中更新,但不在 JPanel 中更新

转载 作者:行者123 更新时间:2023-12-02 07:41:36 25 4
gpt4 key购买 nike

最初的问题是为什么 .getSize() 在调整组件大小后不返回 JCompnent 的实际大小: .getSize() isn't updated

相反,我在 JScrollPane 内添加了一个 JPanel(在本例中为 JPanel),并使用scrollRectToVisible() 来更新 getSize()。考虑这个小例子:

import java.awt.*;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.*;


public class Test extends JFrame implements MouseWheelListener{
JPanel p,p2;
JScrollPane js;

Test(){
setLayout(new FlowLayout());
setPreferredSize(new Dimension(1000,1000));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);

p = new JPanel();
p.setPreferredSize(new Dimension(200,200));

p2=new JPanel();
p2.setPreferredSize(new Dimension(20,20));
p2.setBackground(Color.green);

p.add(p2);
js = new JScrollPane(p);

add(js);

addMouseWheelListener(this);
pack();
}
public static void main(String args[]){
new Test();
}
public void mouseWheelMoved(MouseWheelEvent e) {

System.out.println(p2.getSize());

p2.setPreferredSize(new Dimension(100,100));
p2.revalidate();

p2.scrollRectToVisible(new Rectangle(1,1,1,1));

System.out.println(p2.getSize());
}
}

滚动鼠标滚轮后,单击一下绿色方 block 的大小就会调整。该程序还打印出正确的尺寸。但是,如果我删除scrollRectToVisible(1,1,1,1)正方形的大小被调整,但它打印出错误的大小。问题是:

  1. 除了调用scrollRectToVisible之外还有其他方法来更新getSize()吗?
  2. 如果正方形没有添加到 jscolpane 中怎么办,就像 .getSize() isn't updated 中的示例一样有相应的更新功能吗?

最佳答案

其实没有问题。问题是您调用支持延迟布局的revalidate()。请参阅javadoc :

Supports deferred automatic layout.

Calls invalidate and then adds this component's validateRoot to a list of components that need to be validated. Validation will occur after all currently pending events have been dispatched. ...

特别是在分派(dispatch)所有当前待处理事件后将进行验证

这意味着 p2 的布局(及其大小更改)将在分派(dispatch)所有待处理事件(包括当前的鼠标滚轮事件)后执行。

当您调用scrollToVisibleRect时,如果组件无效,它会自动执行组件的布局,这就是调用scrollToVisibleRect会导致立即调整大小的原因。

如果您确实需要立即调整大小,可以在 p2 的父容器上使用 doLayout() 但我不推荐它,因为它可能会更昂贵。 revalidate() 提供了像 repaint() 那样合并事件的可能性。

关于java - .getSize() 在 JScrollPane 中更新,但不在 JPanel 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11518353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com