JFrame重新调整问题

时间:2011-08-01 22:53:52

标签: java user-interface jframe

所以我正在尝试创建一个基于某个固定值调整宽度和高度的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) {}
    });
}
}

2 个答案:

答案 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);
  }
}