Java un-maximize JFrame
Java un-maximize JFrame
我有一个简单的问题,我没有找到答案二,可能是因为我不知道如何给它起标题。假设我有一个宽度为 X 和高度为 Y 的 JFrame。在我的程序中的某个地方,我必须最大化它以适应整个屏幕,并执行 myJFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
来完成它。现在,稍后我必须将 JFrame "un-maximize" 和 return 设为其原始大小。可能有一个简单的命令,但我还没有找到。我想到了一个类似于 myJFrame.setExtendedState(JFrame.MAXIMIZED_NONE);
的命令
简而言之:最大化 JFrame 后,我该如何 "un-maximize" 呢?
编辑: 看来问题不是我找不到我需要的方法,而是我的一些代码阻止了 myJFrame.setExtendedState(JFrame.NORMAL);
正常工作。这是这个错误代码:
frame.dispose();
if (b) {
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
} else {
frame.setExtendedState(JFrame.NORMAL);
frame.setUndecorated(false);
}
frame.setVisible(true);
重新排列上面代码中的语句解决了问题:)
如果您查看 Frame#setExtendedState
的 JavaDocs,您将看到一个可能值列表
Sets the state of this frame. The state is represented as a bitwise
mask.
- NORMAL
Indicates that no state bits are set.
- ICONIFIED
- MAXIMIZED_HORIZ
- MAXIMIZED_VERT
- MAXIMIZED_BOTH
Concatenates MAXIMIZED_HORIZ and MAXIMIZED_VERT.
那么如果我们看一下 Frame#NORMAL
Frame is in the "normal" state. This symbolic constant names a frame state with all state bits cleared
这看起来很有希望
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
JButton unmax = new JButton("Switch");
unmax.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFrame frame = (JFrame) SwingUtilities.windowForComponent(TestPane.this);
if (frame.getExtendedState() != JFrame.NORMAL) {
frame.setExtendedState(JFrame.NORMAL);
} else {
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
}
});
setLayout(new GridBagLayout());
add(unmax);
}
}
}
所以,所有这一切都是检查当前 windows extendedState
,如果它没有设置为 NORMAL
,则将其设置为 NORMAL
,否则设置MAXIMIZED_BOTH
根据示例代码更新...
好的,基于您的示例代码...
frame.dispose();
if (b) {
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
} else {
frame.setExtendedState(JFrame.NORMAL);
frame.setUndecorated(false);
}
frame.setVisible(true);
问题 "seems" 在于 dispose
或 setUndecorated
或两者的组合。 "seems" 发生的事情是,当您将框架恢复到正常状态时,它会保持最大化时的大小和位置。
所以,我所做的是在 windows bounds
最大化之前抓取一份副本,当它恢复时,我重新应用它
public class TestPane extends JPanel {
private Rectangle previousBounds;
public TestPane() {
JButton unmax = new JButton("Switch");
unmax.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFrame frame = (JFrame) SwingUtilities.windowForComponent(TestPane.this);
frame.dispose();
if (frame.getExtendedState() != JFrame.NORMAL) {
frame.setExtendedState(JFrame.NORMAL);
frame.setUndecorated(false);
frame.setBounds(previousBounds);
} else {
previousBounds = frame.getBounds();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
}
frame.setVisible(true);
}
});
setLayout(new GridBagLayout());
add(unmax);
}
}
我有一个简单的问题,我没有找到答案二,可能是因为我不知道如何给它起标题。假设我有一个宽度为 X 和高度为 Y 的 JFrame。在我的程序中的某个地方,我必须最大化它以适应整个屏幕,并执行 myJFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
来完成它。现在,稍后我必须将 JFrame "un-maximize" 和 return 设为其原始大小。可能有一个简单的命令,但我还没有找到。我想到了一个类似于 myJFrame.setExtendedState(JFrame.MAXIMIZED_NONE);
的命令
简而言之:最大化 JFrame 后,我该如何 "un-maximize" 呢?
编辑: 看来问题不是我找不到我需要的方法,而是我的一些代码阻止了 myJFrame.setExtendedState(JFrame.NORMAL);
正常工作。这是这个错误代码:
frame.dispose();
if (b) {
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
} else {
frame.setExtendedState(JFrame.NORMAL);
frame.setUndecorated(false);
}
frame.setVisible(true);
重新排列上面代码中的语句解决了问题:)
如果您查看 Frame#setExtendedState
的 JavaDocs,您将看到一个可能值列表
Sets the state of this frame. The state is represented as a bitwise mask.
- NORMAL
Indicates that no state bits are set.
- ICONIFIED
- MAXIMIZED_HORIZ
- MAXIMIZED_VERT
- MAXIMIZED_BOTH
Concatenates MAXIMIZED_HORIZ and MAXIMIZED_VERT.
那么如果我们看一下 Frame#NORMAL
Frame is in the "normal" state. This symbolic constant names a frame state with all state bits cleared
这看起来很有希望
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
JButton unmax = new JButton("Switch");
unmax.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFrame frame = (JFrame) SwingUtilities.windowForComponent(TestPane.this);
if (frame.getExtendedState() != JFrame.NORMAL) {
frame.setExtendedState(JFrame.NORMAL);
} else {
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
}
});
setLayout(new GridBagLayout());
add(unmax);
}
}
}
所以,所有这一切都是检查当前 windows extendedState
,如果它没有设置为 NORMAL
,则将其设置为 NORMAL
,否则设置MAXIMIZED_BOTH
根据示例代码更新...
好的,基于您的示例代码...
frame.dispose();
if (b) {
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
} else {
frame.setExtendedState(JFrame.NORMAL);
frame.setUndecorated(false);
}
frame.setVisible(true);
问题 "seems" 在于 dispose
或 setUndecorated
或两者的组合。 "seems" 发生的事情是,当您将框架恢复到正常状态时,它会保持最大化时的大小和位置。
所以,我所做的是在 windows bounds
最大化之前抓取一份副本,当它恢复时,我重新应用它
public class TestPane extends JPanel {
private Rectangle previousBounds;
public TestPane() {
JButton unmax = new JButton("Switch");
unmax.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFrame frame = (JFrame) SwingUtilities.windowForComponent(TestPane.this);
frame.dispose();
if (frame.getExtendedState() != JFrame.NORMAL) {
frame.setExtendedState(JFrame.NORMAL);
frame.setUndecorated(false);
frame.setBounds(previousBounds);
} else {
previousBounds = frame.getBounds();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
}
frame.setVisible(true);
}
});
setLayout(new GridBagLayout());
add(unmax);
}
}