[英].getSize() is updated in a JScrollPane but not in a JPanel
原始問題是為什么.getSize()在調整組件大小后不返回JCompnent的實際大小: .getSize()未更新
相反,我在JScrollPane中添加了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());
}
}
滾動鼠標滾輪后,單擊綠色方塊調整大小。 該程序還打印出正確的大小。 但是,如果我刪除scrollRectToVisible(1,1,1,1) ,則會調整方形大小,但會打印出錯誤的大小 。 問題是:
實際上沒有問題。 問題是你調用revalidate()
支持延遲布局。 看到javadoc :
支持延遲自動布局。
調用無效,然后將此組件的validateRoot添加到需要驗證的組件列表中。 在調度所有當前掛起的事件之后將進行驗證。 ...
特別是在調度所有當前掛起事件之后將進行驗證
這意味着將在調度所有掛起事件(包括當前鼠標滾輪事件)之后執行p2的布局(以及因此其大小更改)。
當您調用scrollToVisibleRect
,如果它無效,它會自動執行組件的布局,這就是調用scrollToVisibleRect導致立即調整大小的原因。
如果你真的需要立即調整大小,你可以在p2
的父容器上使用doLayout()
,但我不推薦它,因為它可能更昂貴。 revalidate()
提供了像repaint()
那樣合並事件的可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.