gpt4 book ai didi

java - 为所有窗口管理器编写正确的 JFrame

转载 作者:行者123 更新时间:2023-11-30 11:48:17 25 4
gpt4 key购买 nike

在 Linux(以及此处在不同的窗口管理器下)、Mac 和 Windows 上始终以相同的方式显示 Java JFrame 窗口的正确方法是什么?

我们实际上在使用 JFrame 时遇到了一些问题,这是非常不一致的,因为在 Windows 上 JFrame 被最大化,在我的 Linux Notebook 上有很棒的 WM,Window 只是打包,在 Mac 下,窗口最大化了一半,所以它比在 Linux 上大,但没有打包......

我们尝试将屏幕设置为最大尺寸,这在 Windows 下似乎工作得很好,但在 Mac 和 Linux 下却不行(Awesome WM)。

这是一个非常简单的框架,它解释了我们目前正在做的事情:

import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class JFrameMaximize extends JFrame {
private static final long serialVersionUID = 1L;

public JFrameMaximize() {
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);

JPanel panel = new JPanel();
// A Fake Dimension, inside this panel are a lot of swing components
panel.setPreferredSize(new Dimension(333, 666));

setContentPane(panel);

// Now we want to set the Extended State
if (Toolkit.getDefaultToolkit().isFrameStateSupported(MAXIMIZED_BOTH)) {
setExtendedState(MAXIMIZED_BOTH);
} else {
System.out.println("Oh oh... i have a problem...");

// Now we need a Fullscreen but we dont have the size of a WindowManager Panels and
// stuff
Dimension max = Toolkit.getDefaultToolkit().getScreenSize();
// asume that the screen has a 20px bar on top (=awesome wm)
max.height -= 20;
setSize(max);
setLocation(0, 20);
// The alternative is to call pack() here, but then the window is totally broken, because of the internal components. Every Panel we load in here has a different size, so the window will scale up and down on every panel change.
}
}

public static void main(String... args) {
new JFrameMaximize();
}
}

问题是一些窗口管理器没有 Maximize_both 扩展状态,所以我们必须计算 - 这不可能对每台 PC 都知道!我们如何才能在每个窗口管理器上将窗口设置为正确的大小?

唯一的解决方案是给 JFrame 一个固定的默认大小吗?并尝试最大化窗口?

最佳答案

一些观察:

  • 始终从 event dispatch thread 开始.

  • 调用pack()然后调整帧大小然后执行setVisible()

  • 考虑使用 getMaximumWindowBounds() :

    GraphicsEnvironment env =
    GraphicsEnvironment.getLocalGraphicsEnvironment();
    Rectangle bounds = env.getMaximumWindowBounds();

已修订 sscce :

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JFrameMaximize extends JFrame {

public JFrameMaximize() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel panel = new JPanel();
// A fake panel representing many swing components
panel.setPreferredSize(new Dimension(333, 666));
panel.setBorder(BorderFactory.createLineBorder(Color.blue, 10));
this.add(panel);
this.pack();
// Now we want to set the Extended State, if supported
if (Toolkit.getDefaultToolkit().isFrameStateSupported(MAXIMIZED_BOTH)) {
System.out.println("Frame state supported.");
this.setExtendedState(MAXIMIZED_BOTH);
} else {
System.out.println("Frame state not supported.");
Dimension max = Toolkit.getDefaultToolkit().getScreenSize();
// TODO see getMaximumWindowBounds()
max.height -= 20;
this.setSize(max);
this.setLocation(0, 20);
}
this.setVisible(true);
}

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

@Override
public void run() {
new JFrameMaximize();
}
});
}
}

关于java - 为所有窗口管理器编写正确的 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8908313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com