我正在研究 Linux Gnome。
我想让窗口保持 16:9 的比例。例如,如果缩放宽度,则代码仅修改高度,因此不会触及用户输入。
通过这种方法,窗口会自行调整大小,使其超出应有的范围。 例如,我稍微缩放了宽度,但高度却比应有的要大得多。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main
{
public static void main(String[] args)
{
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(1280, 720));
panel.setBackground(new Color(89, 108, 171, 255));
JFrame frame = new JFrame("Test");
frame.setLocation(100, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setVisible(true);
panel.addComponentListener(new ComponentAdapter()
{
@Override
public void componentResized(ComponentEvent e)
{
int targetWidth = frame.getSize().width;
int targetHeight = frame.getSize().width * 9 / 16;
if (targetHeight > frame.getSize().height)
{
targetHeight = frame.getSize().height;
targetWidth = frame.getSize().height * 16 / 9;
}
frame.setSize(targetWidth, targetHeight);
}
});
}
}
这就是我的想法。
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(1280, 720));
panel.setBackground(new Color(89, 108, 171, 255));
JFrame frame = new JFrame("Test");
frame.setLocation(100, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p2 = new JPanel();
p2.add(panel);
frame.setContentPane(p2);
frame.pack();
frame.setVisible(true);
p2.addComponentListener(new ComponentAdapter()
{
@Override
public void componentResized(ComponentEvent e)
{
int fw = frame.getSize().width;
int fh = frame.getSize().height;
if( 16*fh > 9*fw ){
panel.setPreferredSize( new Dimension(fw, 9*fw/16) );
} else{
Dimension d = new Dimension(16*fh/9, fh);
panel.setPreferredSize( d );
}
frame.validate();
}
});
这样,您就不会更改用户正在调整的值。 (框架的尺寸)您正在响应更改并确保面板尺寸仍然正确。