Java 未修饰的JFrame maximize在OS X中始终使用主监视器分辨率

Java 未修饰的JFrame maximize在OS X中始终使用主监视器分辨率,java,macos,swing,Java,Macos,Swing,在OS X中最大化次要(或任何非主要)监视器上未装饰的帧时,我遇到了一个问题。在最大化第二个监视器上的帧时,似乎使用了主要监视器的边界,并且帧的大小超出了屏幕边界(如果主要监视器更大)或者它不会填满整个屏幕(如果主监视器较小) 这个问题发生在OS X Yosemite中的Java 1.8.040中。在Windows和Linux中测试时,没有出现此问题 运行应用程序时,它看起来是这样的。添加数字网格是为了能够查看帧是否超出屏幕边界 代码如下: import java.awt.Color; imp

在OS X中最大化次要(或任何非主要)监视器上未装饰的帧时,我遇到了一个问题。在最大化第二个监视器上的帧时,似乎使用了主要监视器的边界,并且帧的大小超出了屏幕边界(如果主要监视器更大)或者它不会填满整个屏幕(如果主监视器较小)

这个问题发生在OS X Yosemite中的Java 1.8.040中。在Windows和Linux中测试时,没有出现此问题

运行应用程序时,它看起来是这样的。添加数字网格是为了能够查看帧是否超出屏幕边界

代码如下:

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MaximizeTest extends JFrame {

    public static void main(String[] args) {
        MaximizeTest frame = new MaximizeTest();
        frame.dispose();
        frame.setUndecorated(true);
        frame.pack();
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private final JPanel mainPanel = new NumberGridPanel();
    private final JButton maximizeButton = new JButton();
    private final JButton closeButton = new JButton();

    public MaximizeTest() {
        initComponents();

        // Added this to be able to drag the frame to other monitors
        MouseAdapter mouseAdapter = new DragMouseAdapter();
        addMouseListener(mouseAdapter);
        addMouseMotionListener(mouseAdapter);
        setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
        maximizeButton.setCursor(Cursor.getDefaultCursor());
        closeButton.setCursor(Cursor.getDefaultCursor());
    }

    private void initComponents() {
        GridBagConstraints gridBagConstraints;

        mainPanel.setLayout(new GridBagLayout());

        maximizeButton.setText("Maximize/Minimize");
        maximizeButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                int state = getExtendedState();
                if ((state & Frame.MAXIMIZED_BOTH) != 0) {
                    setExtendedState(state & ~Frame.MAXIMIZED_BOTH);
                    setSize(400, 400);
                } else {
                    // Take OS taskbars and dockbars into account
                    Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration());
                    if (screenInsets.left == 0 && screenInsets.right == 0
                            && screenInsets.top == 0 && screenInsets.bottom == 0) {
                        setMaximizedBounds(null);
                    } else {
                        Rectangle screenBounds = getGraphicsConfiguration().getBounds();
                        Rectangle newBounds = new Rectangle(
                                screenInsets.left,
                                screenInsets.top,
                                screenBounds.width - (screenInsets.left + screenInsets.right),
                                screenBounds.height - (screenInsets.top + screenInsets.bottom));
                        setMaximizedBounds(newBounds);
                    }

                    setExtendedState(state | Frame.MAXIMIZED_BOTH);
                }
            }
        });
        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.anchor = java.awt.GridBagConstraints.PAGE_END;
        mainPanel.add(maximizeButton, gridBagConstraints);

        closeButton.setText("Close");
        closeButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                System.exit(0);
            }
        });
        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.anchor = java.awt.GridBagConstraints.PAGE_START;
        mainPanel.add(closeButton, gridBagConstraints);

        getContentPane().add(mainPanel, java.awt.BorderLayout.CENTER);
    }

    private static class NumberGridPanel extends JPanel {

        @Override
        protected void paintComponent(Graphics g) {
            g.setColor(Color.BLUE);
            int gridSize = 30;
            int cols = getWidth() / gridSize;
            int rows = getHeight() / gridSize;
            for (int col = 0; col < cols; col++) {
                for (int row = 0; row < rows; row++) {
                    g.drawString(Integer.toString((col + row) * gridSize), col * gridSize, row * gridSize + 10);
                }
            }
        }
    }

    private class DragMouseAdapter extends MouseAdapter {

        private int previousMouseX;
        private int previousMouseY;

        @Override
        public void mousePressed(MouseEvent e) {
            previousMouseX = e.getXOnScreen();
            previousMouseY = e.getYOnScreen();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            int state = getExtendedState();
            if ((state & Frame.MAXIMIZED_BOTH) == 0) { // if not maximized
                setLocation(
                        e.getXOnScreen() - previousMouseX + getX(), 
                        e.getYOnScreen() - previousMouseY + getY());
                previousMouseX = e.getXOnScreen();
                previousMouseY = e.getYOnScreen();
            }
        }
    }
}
导入java.awt.Color;
导入java.awt.Cursor;
导入java.awt.Frame;
导入java.awt.Graphics;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入java.awt.Rectangle;
导入java.awt.Toolkit;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类MaximizeTest扩展了JFrame{
公共静态void main(字符串[]args){
MaximizeTest帧=新的MaximizeTest();
frame.dispose();
框架。设置未装饰(真实);
frame.pack();
框架。设置尺寸(400400);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
private final JPanel mainPanel=新的NumberGridPanel();
私有最终JButton maximizeButton=新JButton();
私有最终JButton closeButton=新JButton();
公共测试(){
初始化组件();
//添加此选项可以将帧拖动到其他监视器
MouseAdapter MouseAdapter=新的DragMouseAdapter();
addMouseListener(mouseAdapter);
addMouseMotionListener(mouseAdapter);
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_Cursor));
maximizeButton.setCursor(Cursor.getDefaultCursor());
setCursor(Cursor.getDefaultCursor());
}
私有组件(){
gridbag约束gridbag约束;
setLayout(新的GridBagLayout());
setText(“最大化/最小化”);
maximizeButton.addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
int state=getExtendedState();
如果((状态和帧最大化)!=0){
setExtendedState(state&~Frame.MAXIMIZED_两者);
设置大小(400400);
}否则{
//将操作系统任务栏和dockbar考虑在内
Insets screenInsets=Toolkit.getDefaultToolkit().getScreenInsets(getGraphicsConfiguration());
如果(screenInsets.left==0&&screenInsets.right==0
&&screenInsets.top==0&&screenInsets.bottom==0){
setMaximizedBounds(空);
}否则{
矩形屏幕边界=getGraphicsConfiguration().getBounds();
矩形新边界=新矩形(
屏幕插图。左,
屏幕插图,
screenBounds.width-(屏幕插图左+屏幕插图右),
screenBounds.height-(ScreenInsetts.top+ScreenInsetts.bottom));
setMaximizedBounds(新边界);
}
setExtendedState(状态|帧最大化_二者);
}
}
});
gridBagConstraints=新的gridBagConstraints();
gridBagConstraints.anchor=java.awt.gridBagConstraints.PAGE\u END;
添加(maximizeButton、gridBagConstraints);
closeButton.setText(“关闭”);
closeButton.addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
系统出口(0);
}
});
gridBagConstraints=新的gridBagConstraints();
gridBagConstraints.anchor=java.awt.gridBagConstraints.PAGE_START;
主面板。添加(关闭按钮、gridBagConstraints);
getContentPane().add(主面板,java.awt.BorderLayout.CENTER);
}
私有静态类NumberGridPanel扩展了JPanel{
@凌驾
受保护组件(图形g){
g、 setColor(Color.BLUE);
int gridSize=30;
int cols=getWidth()/gridSize;
int rows=getHeight()/gridSize;
for(int col=0;col
到目前为止,我还没有在网上找到关于这个问题的任何信息。如果有人能帮我解决这个问题,或者为我指出正确的方向,我将不胜感激。