Java 未修饰的JFrame maximize在OS X中始终使用主监视器分辨率
在OS X中最大化次要(或任何非主要)监视器上未装饰的帧时,我遇到了一个问题。在最大化第二个监视器上的帧时,似乎使用了主要监视器的边界,并且帧的大小超出了屏幕边界(如果主要监视器更大)或者它不会填满整个屏幕(如果主监视器较小) 这个问题发生在OS X Yosemite中的Java 1.8.040中。在Windows和Linux中测试时,没有出现此问题 运行应用程序时,它看起来是这样的。添加数字网格是为了能够查看帧是否超出屏幕边界 代码如下: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
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
到目前为止,我还没有在网上找到关于这个问题的任何信息。如果有人能帮我解决这个问题,或者为我指出正确的方向,我将不胜感激。