所以我正在尝试创建一个基于某个固定值调整宽度和高度的JFrame。
即。 当您使用鼠标更改JFrame的大小时,如果新的宽度或高度值不是20的倍数(下面代码中的固定大小),它会将宽度或高度舍入到最接近的20,然后调整大小JFrame。
宽度似乎有效,但高度不...
请帮助
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class test extends JFrame {
private static JPanel panel = new JPanel(null);
private static int SIZE = 20;
public test() {
panel.setBackground(Color.RED);
this.add(panel);
}
public static void main(String[] args) {
final test frame = new test();
frame.setSize(600, 400);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addComponentListener(new ComponentListener() {
public void componentResized(ComponentEvent e) {
if ((panel.getWidth() % SIZE != 0) || (panel.getHeight() % SIZE != 0)) {
int screenWidth = ((panel.getWidth() + SIZE) / SIZE) * SIZE;
int screenHeight = ((panel.getHeight() + SIZE) / SIZE) * SIZE;
frame.setSize(screenWidth, screenHeight);
}
}
public void componentHidden(ComponentEvent arg0) {}
public void componentMoved(ComponentEvent arg0) {}
public void componentShown(ComponentEvent arg0) {}
});
}
}
答案 0 :(得分:1)
帧大小包括insets(边框的大小)。面板尺寸没有。
您应该使用JFrame getWidth()
和getHeight()
或frame.getInsets()
并将这些内容纳入您的最终尺寸。
这是一个适用于JPanel的版本(因为它似乎是您感兴趣的大小),并在考虑插入内容的同时适当调整JFrame的大小。
public void componentResized(ComponentEvent e) {
if ((panel.getWidth() % SIZE != 0) || (panel.getHeight() % SIZE != 0)) {
int panelWidth = ((panel.getWidth() + SIZE) / SIZE) * SIZE;
int panelHeight = ((panel.getHeight() + SIZE) / SIZE) * SIZE;
Insets i = frame.getInsets();
frame.setSize(screenWidth + i.left + i.right, screenHeight + i.top + i.bottom);
}
}
答案 1 :(得分:1)
您的componentResized()
方法会根据panel
检查值,但您会设置frame
的大小。尝试在方法中将panel
的引用更改为frame
:
public void componentResized(ComponentEvent e) {
if ((frame.getWidth() % SIZE != 0) || (frame.getHeight() % SIZE != 0)) {
int screenWidth = ((frame.getWidth() + SIZE) / SIZE) * SIZE;
int screenHeight = ((frame.getHeight() + SIZE) / SIZE) * SIZE;
frame.setSize(screenWidth, screenHeight);
}
}