ฉันกำลังรวบรวมภาพเคลื่อนไหวที่รวดเร็วและสกปรกโดยใช้วงสวิง ฉันต้องการให้หน้าต่างขยายใหญ่สุด ฉันจะทำเช่นนั้นได้อย่างไร?
ฉันกำลังรวบรวมภาพเคลื่อนไหวที่รวดเร็วและสกปรกโดยใช้วงสวิง ฉันต้องการให้หน้าต่างขยายใหญ่สุด ฉันจะทำเช่นนั้นได้อย่างไร?
คำตอบ:
โดยมีเงื่อนไขว่าคุณกำลังขยาย JFrame:
public void run() {
MyFrame myFrame = new MyFrame();
myFrame.setVisible(true);
myFrame.setExtendedState(myFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
}
setVisible(true)
แรกกรอบที่ไม่ได้ขนาดที่ถูกต้อง ฉันลองทั้งก่อนและหลังsetExtendedState()
และsetVisible()
ต้องเป็นที่หนึ่ง
JFrame
สืบทอดมาจากFrame
)
สิ่งที่ต้องการ this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);
import java.awt.*;
import javax.swing.*;
public class Test extends JFrame
{
public Test()
{
GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
this.setMaximizedBounds(env.getMaximumWindowBounds());
this.setExtendedState(this.getExtendedState() | this.MAXIMIZED_BOTH);
}
public static void main(String[] args)
{
JFrame.setDefaultLookAndFeelDecorated(true);
Test t = new Test();
t.setVisible(true);
}
}
|
เพื่ออะไร? มันทำอย่างใดอย่างหนึ่งและถ้าล้มเหลวมันจะทำอย่างอื่น? หรือคุณกำลังระบุตัวเลือกโปรแกรมเมอร์ (เช่นเลือกหนึ่งใน A | B เพื่อไปในสายนี้) ฉันไม่เคยเห็นไวยากรณ์นี้มาก่อน
หากคุณใช้ JFrame ให้ลองทำเช่นนี้
JFrame frame = new JFrame();
//...
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
ฉันชอบเวอร์ชันนี้:
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Toolkit;
import javax.swing.JFrame;
public class Test
{
public static void main(String [] args)
{
final JFrame frame = new JFrame();
final GraphicsConfiguration config = frame.getGraphicsConfiguration();
final int left = Toolkit.getDefaultToolkit().getScreenInsets(config).left;
final int right = Toolkit.getDefaultToolkit().getScreenInsets(config).right;
final int top = Toolkit.getDefaultToolkit().getScreenInsets(config).top;
final int bottom = Toolkit.getDefaultToolkit().getScreenInsets(config).bottom;
final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
final int width = screenSize.width - left - right;
final int height = screenSize.height - top - bottom;
frame.setResizable(false);
frame.setSize(width,height);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
วิธีตั้งค่า JFrame เป็นแบบเต็มหน้าจอคือการตั้งค่าMAXIMIZED_BOTH
ตัวเลือกที่ย่อมาจากMAXIMIZED_VERT | MAXIMIZED_HORIZ
ซึ่งกำหนดกรอบเพื่อขยายแนวตั้งและแนวนอนตามลำดับ
package Example;
import java.awt.GraphicsConfiguration;
import javax.swing.JFrame;
import javax.swing.JButton;
public class JFrameExample
{
static JFrame frame;
static GraphicsConfiguration gc;
public static void main(String[] args)
{
frame = new JFrame(gc);
frame.setTitle("Full Screen Example");
frame.setExtendedState(MAXIMIZED_BOTH);
JButton button = new JButton("exit");
b.addActionListener(new ActionListener(){@Override
public void actionPerformed(ActionEvent arg0){
JFrameExample.frame.dispose();
System.exit(0);
}});
frame.add(button);
frame.setVisible(true);
}
}
ฉันได้ลองวิธีแก้ปัญหาในเธรดนี้และที่นี่แต่การโทรsetExtendedState(getExtendedState()|Frame.MAXIMIZED_BOTH);
ทันทีหลังจากโทรsetVisible(true);
ดูเหมือนจะไม่ทำงานกับสภาพแวดล้อมของฉัน (Windows 10, JDK 1.8 แถบงานของฉันอยู่ทางด้านขวาของหน้าจอ) การทำเช่นนี้ยังคงเว้นช่องว่างเล็ก ๆ ทางซ้ายขวาและด้านล่าง
อย่างไรก็ตามสิ่งที่ได้ผลสำหรับฉันคือการโทรsetExtendedState(...
เมื่อเปิดใช้งานหน้าต่างดังนี้:
public class SomeFrame extends JFrame {
public SomeFrame() {
// ...
setVisible(true);
setResizable(true);
// if you are calling setSize() for fallback size, do that here
addWindowListener (
new WindowAdapter() {
private boolean shown = false;
@Override
public void windowActivated(WindowEvent we) {
if(shown) return;
shown = true;
setExtendedState(getExtendedState()|JFrame.MAXIMIZED_BOTH);
}
}
);
}
}
ฉันลงเอยด้วยการใช้รหัสนี้:
public void setMaximized(boolean maximized){
if(maximized){
DisplayMode mode = this.getGraphicsConfiguration().getDevice().getDisplayMode();
Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(this.getGraphicsConfiguration());
this.setMaximizedBounds(new Rectangle(
mode.getWidth() - insets.right - insets.left,
mode.getHeight() - insets.top - insets.bottom
));
this.setExtendedState(this.getExtendedState() | JFrame.MAXIMIZED_BOTH);
}else{
this.setExtendedState(JFrame.NORMAL);
}
}
ตัวเลือกนี้ทำงานได้ดีที่สุดในบรรดาตัวเลือกทั้งหมดรวมถึงการรองรับจอภาพหลายจอ ข้อบกพร่องเดียวที่มีคือการใช้ออฟเซ็ตแถบงานบนจอภาพทั้งหมดคือการกำหนดค่าบางอย่าง
คำตอบ @kgiannakakis ถูกต้อง แต่ถ้ามีคนติดปัญหานี้และใช้Java 6บนLinux (ตามตัวอย่างเช่น Mint 19 Cinnamon) สถานะMAXIMIZED_BOTHจะไม่ถูกใช้ในบางครั้ง
คุณสามารถลองเรียกเมธอดpack ()หลังจากตั้งค่าสถานะนี้
ตัวอย่างโค้ด:
public MainFrame() {
setContentPane(contentPanel); //some JPanel is here
setPreferredSize(new Dimension(1200, 800));
setMinimumSize(new Dimension(1200, 800));
setSize(new Dimension(1200, 800));
setExtendedState(JFrame.MAXIMIZED_BOTH);
pack();
}
ไม่จำเป็นถ้าคุณใช้ Java 7+ หรือ Java 6 บน Windows
JFrame.MAXIMIZED_BOTH
แทน