我有一个简单的问题,我没有找到答案二,可能是因为我不知道如何标题。假设我有一个宽度为X且高度为Y的JFrame。在我的程序中,我必须最大化它以适应整个屏幕,然后执行myJFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
来实现它。现在,稍后我必须使JFrame“取消最大化”并返回其原始大小。可能有一个简单的命令,但我没有找到任何。我想到的命令类似myJFrame.setExtendedState(JFrame.MAXIMIZED_NONE);
之类的命令
简而言之:在最大化JFrame之后,我如何“取消最大化”呢?
编辑:似乎问题不在于我无法找到我所使用的方法,而是我的部分代码阻止了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);
重新排列上述代码中的语句解决了问题:)
答案 0 :(得分:2)
如果你看一下Frame#setExtendedState
的JavaDocs,你会看到一个可能的值列表
设置此帧的状态。国家被表示为按位 面具。
- NORMAL
表示未设置状态位 - ICONIFIED
- MAXIMIZED_HORIZ
- MAXIMIZED_VERT
- MAXIMIZED_BOTH
连接MAXIMIZED_HORIZ和MAXIMIZED_VERT。
然后,如果我们看看Frame#NORMAL
框架在"正常"州。此符号常量命名一个帧状态,所有状态位清零
这似乎很有希望
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);
}
}
}
所有这一切都是检查当前窗口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);
好的,基于您的示例代码......
dispose
问题"似乎"与setUndecorated
或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);
}
}
的副本,当它被恢复时,我重新应用了它
public static Number reduceNum1(List<Number> nums) {
return nums.stream().reduce(0, (a, b) -> a);
}