2012-09-21 61 views
6

如果我創建不可調整大小的JFrame,並且啓用了Windows Aero setLocation似乎沒有正確考慮窗口邊框。不可調整大小的窗口邊框和位置

在下面的代碼中,我期望第二幀被定位在第一幀的右側,而不是邊界重疊。如果Aero被禁用,或者我刪除了對setResizable的呼叫,則按照預期完成。

import java.awt.Rectangle; 
import javax.swing.JFrame; 
public class FrameBorders { 
public static void main(String[] args) { 
    JFrame frame1 = new JFrame("frame 1"); 
    JFrame frame2 = new JFrame("frame 2"); 

    frame1.setResizable(false); 
    frame2.setResizable(false); 

    frame1.setVisible(true);   
    Rectangle bounds = frame1.getBounds();  
    frame2.setLocation(bounds.x+bounds.width, bounds.y); 
    frame2.setVisible(true); 

} 
} 

我做錯了什麼或這是一個錯誤? 如何可以並排顯示2個不可重複的對話框而不會有重疊邊框?

編輯:加入截圖(也改變幀2到一個JDialog,而不是一個JFrame)

航空在: Aero On

航空關: Aero Off

航空開,但可調整大小: Aero On but resizable

+0

爲什麼你想不具有重疊邊界顯示並排2 unresizable對話框的一面呢? –

+0

我想顯示最初並排放置的兩個窗口 – msam

+2

請不要在不可調整大小的容器上設置任意邊界。參見[*使用多個JFrames,好/壞實踐*](http://stackoverflow.com/a/9554657/230513)? – trashgod

回答

7

se有什麼問題不可調整大小的容器?

假設您調整邊界在您的平臺上看起來不錯。假設用戶的平臺有一個不同的字體,比如說大一點的FontMetrics。這個例子有點做作,但你明白了。如果您更改不可調整大小的容器的邊界,請確保無論主機平臺的默認字體如何,都可以看到任何文本。

image

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

/** 
* @see http://stackoverflow.com/a/12532237/230513 
*/ 
public class Evil extends JPanel { 

    private static final String s = 
     "Tomorrow's winning lottery numbers: 42, "; 
    private JLabel label = new JLabel(s + "3, 1, 4, 1, 5, 9", JLabel.LEFT); 

    public Evil() { 
     this.add(label); 
    } 

    private void display() { 
     JFrame f = new JFrame("Evil"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this, BorderLayout.WEST); 
     f.pack(); 
     int w = SwingUtilities.computeStringWidth(
      label.getFontMetrics(label.getFont()), s); 
     int h = f.getHeight(); 
     f.setSize(w, h); 
     f.setResizable(false); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Evil().display(); 
      } 
     }); 
    } 
} 
+1

你可能已經很有錢了! – trashgod

+0

就調整大小而言,這是一個很好的觀點(如果單獨考慮,這將是我在評論中提出的問題的一個很好的答案),但是我最初的問題是定位問題。假設使用pack()/ no text/size不會改變,甚至是空的對話框/框架,就像我自己設計的例子。 – msam

+1

嘗試使用'pack()',它使「這個'Window'的大小適合其子組件的首選大小和佈局。」對不起,我不使用航空;顯示您描述的問題的[sscce](http://sscce.org/)可能會有所幫助。 – trashgod

5

看來,這不是Java的問題,而是一個航空程序兼容性問題,如所描述here

一個解決方案,我在Java中看到的是讓窗口調整大小的工作,然後圍繞setMaximumSize bug

+0

+1好找... –

+0

良好的鏈接;該平臺擁有框架裝飾,所以結果不是完全離譜的; 「aqua」也有類似的異常情況。 – trashgod