.getSize()未更新 [英] .getSize() isn't updated

查看:67
本文介绍了.getSize()未更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要能够在事件函数中更改JPanel的大小,然后再次获取该大小.似乎直到函数调用完成后,才会更新JPanel.如何获得实际尺寸? 这是一个SSCCE:

I need to be able to change the size of an JPanel in a event function and then get the size again. It seems that the JPanel is not updated untill the function call has been finished. How can I get the real size? This is an SSCCE:

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;
Test(){
    setLayout(new FlowLayout());
    setPreferredSize(new Dimension(1000,1000));
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);

    p = new JPanel();
    p.setPreferredSize(new Dimension(200,200));
    p.setBackground(Color.red);
    add(p);

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

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

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

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

代码工作正常,但是如果我将鼠标滚动一步,它将在控制台中显示以下内容:

The code works fine, but it prints the following in the console if I scroll the mouse one step:

java.awt.Dimension [width = 200,height = 200]

java.awt.Dimension[width=200,height=200]

java.awt.Dimension [width = 200,height = 200]

java.awt.Dimension[width=200,height=200]

我要打印:

java.awt.Dimension [width = 200,height = 200]

java.awt.Dimension[width=200,height=200]

java.awt.Dimension [width = 100,height = 100]

java.awt.Dimension[width=100,height=100]

推荐答案

您的代码对我有用,但仅在鼠标滚轮事件上有效,您必须使用鼠标滚轮滚动

your code works for me, but working only on mouse wheel event, you have to scroll with mouse wheel

修改示例

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

public class Test extends JFrame implements MouseWheelListener {

    private static final long serialVersionUID = 1L;
    private JPanel p;

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

        p = new JPanel();
        p.setPreferredSize(new Dimension(200, 200));
        p.setBackground(Color.red);
        add(p);
        addMouseWheelListener(this);
        pack();
        setVisible(true);
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
        Dimension dim100 = new Dimension(100, 100);
        Dimension dim200 = new Dimension(200, 200);
        System.out.println(p.getSize());
        if (p.getPreferredSize().equals(dim100)) {
            p.setPreferredSize(dim200);
            p.revalidate();
            System.out.println(p.getSize());
        } else if (p.getPreferredSize().equals(dim200)) {
            p.setPreferredSize(dim100);
            p.revalidate();
            System.out.println(p.getSize());
        }
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test();
            }
        });
    }
}

必须延迟System.out.println(p.getSize());,在这种情况下,invokeLater()最好,因为在EDT中完成所有事件后容器返回更改的Dimension

have to delay System.out.println(p.getSize());, invokeLater() is best of all in this case, becase container returned changed Dimension after all events are done in the EDT

示例

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

public class Test extends JFrame implements MouseWheelListener {

    private static final long serialVersionUID = 1L;
    private JPanel p;

    public Test() {
        setLayout(new FlowLayout());
        setPreferredSize(new Dimension(1000, 1000));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        p = new JPanel();
        p.setPreferredSize(new Dimension(900, 900));
        p.setBackground(Color.red);
        add(p);
        addMouseWheelListener(this);
        pack();
        setVisible(true);
    }

    public void mouseWheelMoved(MouseWheelEvent e) {
        Dimension dim100 = p.getSize();
        System.out.println("before "+ p.getSize());
        p.setPreferredSize(new Dimension(dim100.height - 5, dim100.width - 5));
        p.revalidate();
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                System.out.println("after "+ p.getSize());
            }
        });
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test();
            }
        });
    }
}

生成

before java.awt.Dimension[width=900,height=900]
after java.awt.Dimension[width=895,height=895]
before java.awt.Dimension[width=895,height=895]
after java.awt.Dimension[width=890,height=890]
before java.awt.Dimension[width=890,height=890]
after java.awt.Dimension[width=885,height=885]
before java.awt.Dimension[width=885,height=885]
after java.awt.Dimension[width=880,height=880]
before java.awt.Dimension[width=880,height=880]
after java.awt.Dimension[width=875,height=875]
before java.awt.Dimension[width=875,height=875]
after java.awt.Dimension[width=870,height=870]
before java.awt.Dimension[width=870,height=870]
after java.awt.Dimension[width=865,height=865]
before java.awt.Dimension[width=865,height=865]
after java.awt.Dimension[width=860,height=860]

这篇关于.getSize()未更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆