2012-12-12 57 views
3

如果你不知道什麼是「AdjustWidowRect」的確,這裏的描述從MSDN:Win32函數「AdjustWindowRect」中是否存在Java JFrame等價物?

計算窗口矩形所需要的尺寸,根據所需的客戶矩形大小。

更清楚:

在搖擺,當你設置一個JFrame的大小,包括邊界。這意味着,如果您通過480設置的JFrame 640的大小,不會是客戶端大小,因爲大小您輸入計數幀邊框的大小。

我想要一個矩形,並且能夠調整它,所以當JFrame的大小設置爲該矩形時,JFrame的客戶端大小是矩形在調整之前的大小。

+0

爲什麼你需要它? – ignis

+1

@ignis我正在繪製圖形到JFrame,我需要它是一個精確的大小。 – Aaron

回答

2

AFAIU接受的答案不考慮混合菜單欄或其他組件。這通過覆蓋部件的優選尺寸幷包裝框架來實現。

我正在繪製圖形到JFrame,我需要它是一個精確的大小。

不要塗漆到頂級容器,如JFrameJWindow。相反,渲染一個JPanelBufferedImage,並把它添加到TLC。

Sized GUI - from the 'inside out'

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class SizedGUI { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       // the GUI as seen by the user (without frame) 
       JPanel gui = new JPanel(new BorderLayout()); 
       gui.setBorder(new EmptyBorder(2,3,2,3)); 

       gui.add(new FixedSizeComponent()); 

       gui.setBackground(Color.RED); 

       JFrame f = new JFrame("Demo"); 
       f.add(gui); 
       // Ensures JVM closes after frame(s) closed and 
       // all non-daemon threads are finished 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       // See http://stackoverflow.com/a/7143398/418556 for demo. 
       f.setLocationByPlatform(true); 

       // ensures the frame is the minimum size it needs to be 
       // in order display the components within it 
       f.pack(); 
       // tweak to ensure the GUI never gets too small 
       f.setMinimumSize(f.getSize()); 
       // should be done last, to avoid flickering, moving, 
       // resizing artifacts. 
       f.setVisible(true); 
      } 
     }; 
     // Swing GUIs should be created and updated on the EDT 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html 
     SwingUtilities.invokeLater(r); 
    } 
} 

class FixedSizeComponent extends JPanel { 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400,100); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     int w = getWidth(); 
     int h = getHeight(); 
     g.setColor(Color.BLACK); 
     g.drawString(w + "x" + h, w/2, h/2); 
    } 
} 
+0

嗯,我不能接受,因爲我已經做了另外一個,但我肯定會利用你的答案,+1非常感謝! – Aaron

+0

*「我不能接受,因爲我已經做了另一個」*總是有'不接受'。 ;) –

+0

對不起,我知道,但我給了帥哥接受我真的不認爲它的權利只是把它拿走... – Aaron

3

你必須計算JFrame的插圖,並將它們添加到所需的客戶端大小,設置JFrame的大小。

Insets insets = getInsets(); 
+0

非常感謝! – Aaron

相關問題