2011-08-01 222 views
1

所以我想創建一個JFrame,它將根據某個固定值調整寬度和高度。JFrame調整大小問題

ie 當您使用鼠標更改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) {} 
    }); 
} 
} 

回答

1

幀大小包括插圖(邊框的大小)。面板尺寸沒有。

您應該使用JFrame getWidth()getHeight()frame.getInsets(),並將其計入您的最終尺寸。

下面是一個針對JPanel的版本(因爲它似乎是您感興趣的大小),並在考慮插入內容的同時適當地調整JFrame的大小。基於該panel

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

componentResized()方法檢查值,但然後設置frame的大小。嘗試在您的方法中更改對panelframe的引用:

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