首页 > 解决方案 > 我希望任务栏可见并最大化我的框架

问题描述

代码片段:

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLayout(null);
frame.setVisible(true);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); // for fit to screen maximize

就像在游戏中一样,我不希望它可以调整大小;同时我想让任务栏和标题栏可见(就像任何应用程序一样)

标签: javaswinguser-interfacejframetaskbar

解决方案


解决此问题的一种方法是扩展 JFrame 类并覆盖最大化方法以减小帧大小

import java.awt.*;
import javax.swing.*;

public class MyFrame extends JFrame
{
    private Rectangle maxBounds;
    
    public MyFrame()
    {
        super();        
        maxBounds = null;
    }
    
    @Override
    public Rectangle getMaximizedBounds()
    {
        return maxBounds;
    }
    
    @Override
    public synchronized void setMaximizedBounds(Rectangle maxBounds)
    {
        this.maxBounds = maxBounds;
        super.setMaximizedBounds(maxBounds);
    }
    
    @Override
    public synchronized void setExtendedState(int state)
    {       
        if (maxBounds == null &&
            (state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH)
        {
            Insets screenInsets = getToolkit().getScreenInsets(getGraphicsConfiguration());         
            Rectangle screenSize = getGraphicsConfiguration().getBounds();
            Rectangle maxBounds = new Rectangle(screenInsets.left + screenSize.x, 
                                        screenInsets.top + screenSize.y, 
                                        screenSize.x + screenSize.width - screenInsets.right - screenInsets.left,
                                        screenSize.y + screenSize.height - screenInsets.bottom - screenInsets.top);
            
            super.setMaximizedBounds(maxBounds);
        }
    
        super.setExtendedState(state);
    }
}

然后只需实例化自定义 MyFrame 类

MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLayout(null);
frame.setVisible(true);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

推荐阅读