从Java获取有效的屏幕大小
我想得到有效的屏幕尺寸。即:不带任务栏的屏幕大小(或Linux/Mac上的同等大小) 我目前正在使用从Java获取有效的屏幕大小,java,swing,awt,Java,Swing,Awt,我想得到有效的屏幕尺寸。即:不带任务栏的屏幕大小(或Linux/Mac上的同等大小) 我目前正在使用 component.getGraphicsConfiguration().getBounds() …并根据操作系统减去默认的任务栏大小,但我希望有一种即使用户调整/移动了任务栏大小也能正常工作的方法。这可以在没有任务栏的情况下以像素为单位确定屏幕大小 //size of the screen Dimension screenSize = Toolkit.getDefaultToolkit().
component.getGraphicsConfiguration().getBounds()
…并根据操作系统减去默认的任务栏大小,但我希望有一种即使用户调整/移动了任务栏大小也能正常工作的方法。这可以在没有任务栏的情况下以像素为单位确定屏幕大小
//size of the screen
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//height of the task bar
Insets scnMax = Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration());
int taskBarSize = scnMax.bottom;
//available size of the screen
setLocation(screenSize.width - getWidth(), screenSize.height - taskBarSize - getHeight());
编辑
有人能在Xx_-nix和Mac-OSX上运行这段代码并检查JDialog是否真的位于右下角吗
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
public class NotificationPopup {
private static final long serialVersionUID = 1L;
private LinearGradientPaint lpg;
private JDialog dialog = new JDialog();
private BackgroundPanel panel = new BackgroundPanel();
public NotificationPopup() {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Insets scnMax = Toolkit.getDefaultToolkit().
getScreenInsets(dialog.getGraphicsConfiguration());
int taskBarSize = scnMax.bottom;
panel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.weightx = 1.0f;
constraints.weighty = 1.0f;
constraints.insets = new Insets(5, 5, 5, 5);
constraints.fill = GridBagConstraints.BOTH;
JLabel l = new JLabel("You have got 2 new Messages.");
panel.add(l, constraints);
constraints.gridx++;
constraints.weightx = 0f;
constraints.weighty = 0f;
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.NORTH;
JButton b = new JButton(new AbstractAction("x") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(final ActionEvent e) {
dialog.dispose();
}
});
b.setOpaque(false);
b.setMargin(new Insets(1, 4, 1, 4));
b.setFocusable(false);
panel.add(b, constraints);
dialog.setUndecorated(true);
dialog.setSize(300, 100);
dialog.setLocation(screenSize.width - dialog.getWidth(),
screenSize.height - taskBarSize - dialog.getHeight());
lpg = new LinearGradientPaint(0, 0, 0, dialog.getHeight() / 2,
new float[]{0f, 0.3f, 1f}, new Color[]{new Color(0.8f, 0.8f, 1f),
new Color(0.7f, 0.7f, 1f), new Color(0.6f, 0.6f, 1f)});
dialog.setContentPane(panel);
dialog.setVisible(true);
}
private class BackgroundPanel extends JPanel {
private static final long serialVersionUID = 1L;
BackgroundPanel() {
setOpaque(true);
}
@Override
protected void paintComponent(final Graphics g) {
final Graphics2D g2d = (Graphics2D) g;
g2d.setPaint(lpg);
g2d.fillRect(1, 1, getWidth() - 2, getHeight() - 2);
g2d.setColor(Color.BLACK);
g2d.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
}
}
public static void main(final String[] args) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
System.out.println(info.getName());
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (UnsupportedLookAndFeelException e) {
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
NotificationPopup notificationPopup = new NotificationPopup();
}
});
}
}
GraphicsEnvironment有一个返回最大可用大小、计算所有任务栏等的方法,无论它们在何处对齐:
GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds()
注意:在多监视器系统上,
getMaximumWindowBounds()
返回整个显示区域的边界。要获得单个显示的可用边界,请使用GraphicsConfiguration.getBounds()
和Toolkit.getScreenInsets()
,如其他答案所示。以下是我最后使用的代码:
GraphicsConfiguration gc = // ...
Rectangle bounds = gc.getBounds();
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
Rectangle effectiveScreenArea = new Rectangle();
effectiveScreenArea.x = bounds.x + screenInsets.left;
effectiveScreenArea.y = bounds.y + screenInsets.top;
effectiveScreenArea.height = bounds.height - screenInsets.top - screenInsets.bottom;
effectiveScreenArea.width = bounds.width - screenInsets.left - screenInsets.right;
下面是我写的一个方法,通过减去边距并在屏幕上居中来快速计算
public void setToEffectiveScreenSize() {
double width, height, x, y;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Insets bounds = Toolkit.getDefaultToolkit().getScreenInsets(frmMain.getGraphicsConfiguration());
// Calculate the height/length by subtracting the margins
// (x,y) = ( (screenHeight-windowHeight)/2, (screenWidth - windowWidth)/2 )
width = screenSize.getWidth() - bounds.left - bounds.right;
height = screenSize.getHeight() - bounds.top - bounds.bottom;
// Now center the new rectangle inside the screen
x = (screenSize.getHeight() - height) / 2.0;
y = (screenSize.getWidth() - width) / 2.0;
frmMain.setBounds((int)x,(int)y,(int)width,(int)height);
}
它可能是可以修复的,但在多屏幕设置中似乎不起作用。有两个级别,是什么意思<代码>1)一个容器填充两个或多个multi_监视器(未在Java7中测试,但不支持Java6),或
2)
一个容器放置在其中一个multi_监视器上(由alain.janinm回答),@mKorbel:在单屏幕Mac上测试正常@Rasmus:您可以在GraphicsEnvironment
@mKorbel中获取任何可用GraphicsConfiguration
的边界:如果对话框未放置在主屏幕上,您的代码将出现问题:screenSize
将是主屏幕的大小,但是scnMax
将是对话框所在屏幕的屏幕插图。此外,一些平台(如更新版本的Ubuntu)的任务栏位于左侧。也就是说,这些问题很容易解决,我希望在完成测试后接受您的回答。@Rasmus Faber抱歉,我不是具有GUI界面的Xxx_nix用户(不包括WinOS),那么我无法打开左侧的测试工具栏,顺便说一句,这就是我在Xx_-nix和Mac上发送测试请求的原因OSX@mKorbel:我已经在Ubuntu、OSX和Windows7上进行了测试。一旦应用程序进入测试阶段,它将在多个平台上进行测试(如果我们在任何地方遇到问题,我一定会在这里指出)。在我的例子中,它返回整个高度。(当任务栏是透明的并且windows可以在下面运行时)