[英]Java un-maximize JFrame
我有一個簡單的問題,我找不到答案二,可能是因為我不知道如何給它加上標題。 可以說我有一個寬度為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);
重新排列以上代碼中的語句可解決問題:)
如果您查看Frame#setExtendedState
的JavaDocs,將看到可能值的列表
設置該框架的狀態。 該狀態表示為按位掩碼。
-正常
指示未設置任何狀態位。
-已確認
-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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.