猿问

尝试考虑 Java 中的任务栏会导致窗口大小不准确

当我尝试运行这段代码时,它会导致 JFrame 出于某种原因稍微向右移动大约 10 个像素,并且窗口的高度也超出了任务栏,而所需的效果是使其完成 AT任务栏。


我试过将 jframe 设置为未装饰,这解决了整个问题,一切都在它应该在的地方结束。但是当我将 undecorated 设置为 false 时,它似乎取代并破坏了窗口的位置。


import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.GraphicsEnvironment;

import java.awt.Toolkit;


import javax.swing.JComponent;

import javax.swing.JFrame;


public class Component extends JComponent

{



/**

 * 

 */

private static final long serialVersionUID = 1L;


public int width, height;

public int tps;


private Game game;


public Component()

{

    Toolkit kit = this.getToolkit();

    width = (int) kit.getScreenSize().getWidth();

    height = (int) GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().getHeight();

    setLayout(new BorderLayout());

    setPreferredSize(new Dimension(width, height));


    game = new Game(this);

    add(game);


    initWindow("Test", this);

}


public void initWindow(String title, JComponent component)

{

    JFrame jf = new JFrame(title);

    jf.setResizable(false);

    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    jf.add(component);

    jf.pack();

    jf.setLocationRelativeTo(null);


    jf.setVisible(true);

}


}


Smart猫小萌
浏览 116回答 1
1回答

慕标琳琳

问题是您setPreferredSize在 的构造函数中调用Component,因此它的大小调整请求应用于框架的内容。当JFrame创建装饰时,它会增加该维度。解决方案是将调用应用于setPreferredSize,JFrame例如在initWindow:public void initWindow(String title, JComponent component){    JFrame jf = new JFrame(title);    Toolkit kit = this.getToolkit();    int width = (int) kit.getScreenSize().getWidth();    int height = (int) GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().getHeight();    jf.setPreferredSize(new Dimension(width, height));    // ...}这是一个演示程序,至少在我的系统上,它重现了问题并演示了解决方案。取消注释1并注释掉2会重现该问题。反转注释掉的行即可解决。public class FitToScreenDemo {    public static void main(String[] args) {        JFrame frame = new JFrame();        JComponent component = new JComponent() {};        frame.add(component);//      component.setPreferredSize(getDimensionWithoutTaskBar()); // 1        frame.setPreferredSize(getDimensionWithoutTaskBar());     // 2        frame.pack();        frame.setVisible(true);    }    private static Dimension getDimensionWithoutTaskBar() {        return new Dimension((int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(),            (int) GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().getHeight());    }}
随时随地看视频慕课网APP

相关分类

Java
我要回答