2017-07-10 38 views
0

我知道在JVM上运行的java使它独立于平台。我最近正在学习开发桌面应用程序,所以我的问题是:如何让我的appscreen在右上/左上或右下/左下或中心弹出?等等,用于右上方我们可以简单地使用:
frame.setLocation(0,0)
或为中心,一个良好的,独立于平台的方式,我发现这里是:
frame.setLocationRelativeTo(null)将Jframe对齐到不同的位置

但对其他3条边是什么?我看到了一些使用其他类(尺寸/点类)或包的大块代码,但它们要么太复杂,要么涉及特定的方向(就像我在这里看到的一个答案很容易让我的应用程序弹出底部;但是如果我的老师说他想看到顶部的应用程序弹出,我不得不重新编码我的整个解决方案)。我也尝试使用getmaximumsize().height/width,但没有好处。我希望如果有人能够帮助我处理所有可能的边缘和中心位置的代码(即使它使用其他类/包;只要满足上述所有情况,您的答案是受欢迎的)。和另一个小问题:在java中是否有任何变量MAXWINDOW,我的窗口屏幕是15.6“,下面的0.5”工具栏使我的250 * 100像素jframe的理想底部为0,15.5“,这是一个变量,理想值?并根据我的工具栏或具有更小/更大尺寸和工具栏位置的操作系统的位置更改其值?
它只是想到了,因为它感觉像这样的变量可能非常方便,并增加了更多的Java平台的独立性性质。

编辑 ...
由于双方@bjorn和@madprogrammer他们过很好的答案。我从来没有想过,“越来越为位置自由任务栏,窗口大小”问题瓦特考虑到平台独立条款,生病需要这么大的代码。我觉得比约恩的答案目前完全满足了我。但是疯狂的回答更准确(或精确?呃我的英语)到我引用的问题。

+1

*“我甚至可以使用此代码段用于获取一个最大大小的窗口” * - 我会查看'JFrame#setExtendedState',并以独立于平台的方式最大化窗口,这将不会将窗口的任何部分放置在任务栏/ dock的底部 – MadProgrammer

回答

3

Toolkit.getDefaultToolkit().getScreenSize();返回默认屏幕的全屏幕尺寸,但它没有考虑到其他屏幕元素,如底座或任务栏,它并不总是在屏幕的底部,并非总是同样大小

一个更好的解决方案可能是使Toolkit.getDefaultToolkit().getScreenInsetsGraphicsConfiguration

public static Rectangle getScreenViewableBounds(Window window) { 
    return getScreenViewableBounds((Component) window); 
} 

public static Rectangle getScreenViewableBounds(Component comp) { 
    return getScreenViewableBounds(getGraphicsDevice(comp)); 
} 

public static Rectangle getScreenViewableBounds(GraphicsDevice gd) { 
    Rectangle bounds = new Rectangle(0, 0, 0, 0); 
    if (gd == null) { 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     gd = ge.getDefaultScreenDevice(); 
    } 

    if (gd != null) { 
     GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
     bounds = gc.getBounds(); 

     Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc); 
     bounds.x += insets.left; 
     bounds.y += insets.top; 
     bounds.width -= (insets.left + insets.right); 
     bounds.height -= (insets.top + insets.bottom); 
    } 

    return bounds; 
} 

这种使用会返回一个特定画面的“安全可视”的范围。如果你通过它null,它将使用“默认”屏幕

// Safe viewable area for default screen 
Rectangle bounds = getScreenViewableBounds(null); 
int x = bounds.x + ((bounds.width - getWidth()); 
int y = bounds.y + ((bounds.width - getHeight()); 

setLocation(x, y); 

这将放置在窗口的底部/右边位置的窗口,但是,把它对准到任务栏(因为大多数人都有它沿底部)

对于怪异的人,像我一样,谁把任务栏在屏幕

// Safe viewable area for default screen 
Rectangle bounds = getScreenViewableBounds(null); 
int x = bounds.x; 
int y = bounds.y; 

setLocation(x, y); 

的顶部将放置在可视的顶部/左上角的窗口,下面排列对齐任务栏

是的,我见过太多的开发人员使用setLocation(0, 0)并把窗口任务栏/菜单栏下,他们的名字变成了“泥”

+0

谢谢你这样深入的回答!你已经编写了一个解决方案,正是我正在考虑的问题。尽管现在我看到了答案,我认为我引用的问题有点更讨厌xD。当我有足够的知识来理解它的整体时,它肯定会回到这个解决方案。(有点小白,你知道:p) –

3

你可以在屏幕的下面的代码大小:

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
double width = screenSize.getWidth(); 
double height = screenSize.getHeight(); 

在您框架,那么你可以从屏幕的宽度减去Jframe的宽度设定根据位置。对于高度,相应的程序是相同的。

+0

谢谢!我甚至可以使用此片段获取最大窗口:) –

+0

这并没有考虑像码头或任务栏这样的元素,并冒着将窗户放在它们下面的风险 – MadProgrammer

+0

@anshsachdeva:这不是一个好主意。你最好调用[JFrame.setExtendedState(int)](https://docs.oracle.com/javase/7/docs/api/java/awt/Frame.html#setExtendedState(int)) –