Java .getSize()不是';t更新
我需要能够在事件函数中更改JPanel的大小,然后再次获取大小。在函数调用完成之前,JPanel似乎不会更新。我怎样才能得到真正的尺寸这是一个SSCCE:Java .getSize()不是';t更新,java,swing,user-interface,jpanel,Java,Swing,User Interface,Jpanel,我需要能够在事件函数中更改JPanel的大小,然后再次获取大小。在函数调用完成之前,JPanel似乎不会更新。我怎样才能得到真正的尺寸这是一个SSCCE: import java.awt.*; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import javax.swing.*; public class Test extends JFrame implements Mous
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());
}
}
代码工作正常,但如果我滚动鼠标一步,它会在控制台中打印以下内容:
java.awt.Dimension[宽度=200,高度=200]
java.awt.Dimension[宽度=200,高度=200]
我想把它打印出来:
java.awt.Dimension[宽度=200,高度=200]
java.awt.Dimension[width=100,height=100]如果要更改大小,是否也需要调用paint() 修改示例
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中完成所有事件后,容器返回了已更改的维度
范例
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]
不,发出重新绘制请求只会删除视觉瑕疵。您几乎从不直接调用paint,在这种情况下肯定不会。感谢您的回复,您的代码工作得很好,您可以向后滚动大小:),但这不是我的问题,我只是希望在滚动滚轮后能够从getSize()获得正确的大小。也许我不够清楚,我编辑了这个问题。谢谢,正是我想做的。我必须阅读更多关于invokelater()的内容:)我还发现我可以在JScrollPane中添加JPanel并使用p.scrollRectToVisible(新的Rect(1,1,1,1));它以某种方式更新了gui。有一个命令可以更新吗?@user1506145最好是发布一个单独的问题:-),使用类似于此线程的可运行代码