2012-09-21 74 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