首先,我想澄清一下,我知道这个问题已经被问过很多次了。但是,我还没有找到对我有用的答案。
我正在尝试制作一款需要分辨率的游戏。因此,我开始工作,使一个组件适应另一个组件的大小,同时保持纵横比。
但我遇到了一个问题,那就是对象会发生某种轻弹或调整大小,特别是当 JFrame 变小时。
除了调查之外,我还检查了秤给出的数字是否有意义,并且没有发现任何异常情况。我还尝试激活双缓冲(尽管知道它在 JPanel 中默认启用)但什么也没有......
我在下面编写了类似的代码,以便您可以查看并测试发生了什么。有什么错误吗?
package novely;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class TestApp extends JFrame{
private JPanel panel;
private JPanel container;
public TestApp() {
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.container = new JPanel(new GridBagLayout());
this.panel = new JPanel();
this.panel.setBackground(Color.black);
this.container.addComponentListener(new ComponentListener() {
@Override
public void componentResized(ComponentEvent e) {
int reswidth = 800;
int resheight = 600;
Dimension parent_size = container.getSize();
double scale = Math.min((double) parent_size.height / resheight,
(double) parent_size.width / reswidth);
panel.setPreferredSize(new Dimension((int) (reswidth * scale), (int) (resheight * scale)));
panel.revalidate();
}
@Override
public void componentMoved(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentHidden(ComponentEvent e) {
// TODO Auto-generated method stub
}
});
this.container.add(this.panel);
add(this.container);
}
static public void main(String[] args) {
TestApp app = new TestApp();
app.setVisible(true);
}
}
问题是您正在尝试在 ComponentListener 中添加布局管理逻辑。
是的,ComponentListener 设置首选大小,但是getPreferredSize()
需要时可以通过Swing在面板上单独调用该方法。默认的 getPreferredSize() 逻辑将返回 (10, 10) 的大小,因此您会看到一个短暂绘制的小矩形。
解决方案是将首选尺寸逻辑移至组件:
import java.awt.*;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class TestApp extends JFrame{
private JPanel panel;
private JPanel container;
public TestApp() {
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.container = new JPanel(new GridBagLayout());
this.panel = new JPanel()
{
@Override
public Dimension getPreferredSize()
{
int reswidth = 800;
int resheight = 600;
Dimension parent_size = container.getSize();
double scale = Math.min((double) parent_size.height / resheight,
(double) parent_size.width / reswidth);
return new Dimension((int) (reswidth * scale), (int) (resheight * scale));
}
};
this.panel.setBackground(Color.black);
this.container.add(this.panel);
add(this.container);
}
static public void main(String[] args) {
TestApp app = new TestApp();
app.setVisible(true);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)