簡體   English   中英

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

[英].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) ,則會調整方形大小,會打印出錯誤的大小 問題是:

  1. 還有另一種方法,而不是調用scrollRectToVisible來更新getSize()?
  2. 如果沒有在jscollpane中添加square,如.getSize()中的示例沒有更新 ,那么會有相應的更新函數嗎?

實際上沒有問題。 問題是你調用revalidate()支持延遲布局。 看到javadoc

支持延遲自動布局。

調用無效,然后將此組件的validateRoot添加到需要驗證的組件列表中。 在調度所有當前掛起的事件之后將進行驗證。 ...

特別是在調度所有當前掛起事件之后將進行驗證

這意味着將在調度所有掛起事件(包括當前鼠標滾輪事件)之后執行p2的布局(以及因此其大小更改)。

當您調用scrollToVisibleRect ,如果它無效,它會自動執行組件的布局,這就是調用scrollToVisibleRect導致立即調整大小的原因。

如果你真的需要立即調整大小,你可以在p2的父容器上使用doLayout() ,但我不推薦它,因為它可能更昂貴。 revalidate()提供了像repaint()那樣合並事件的可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM