Cửa sổ JFrame Maximize


89

Tôi đang tập hợp một hoạt ảnh nhanh và bẩn bằng cách sử dụng xích đu. Tôi muốn cửa sổ được mở rộng tối đa. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


133

Với điều kiện bạn đang mở rộng JFrame:

public void run() {
    MyFrame myFrame = new MyFrame();
    myFrame.setVisible(true);
    myFrame.setExtendedState(myFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
}

13
Việc truy cập trường tĩnh thông qua một thể hiện là một thực tiễn không tốt. Sử dụng JFrame.MAXIMIZED_BOTHthay thế.
nimcap

2
Lỗi lớn, rất lớn và các vấn đề ở trên! (Chà, được thôi, cảnh báo nhỏ không có hậu quả lớn ...) Phải là Frame.MAXIMIZED_BOTH chứ không phải JFrame.MAXIMIZED_BOTH! :)
Manius

Tại sao bạn lại gọi setVible (true) đầu tiên? Nó có đáng kể không? Nó cũng hoạt động tốt mà không cần (ubuntu).
AvrDragon

1
Nếu không có setVisible(true)đầu tiên, khung không được định kích thước chính xác. Tôi đã thử nó cả trước và sau setExtendedState(), và setVisible()phải là người đầu tiên.
mjibson

2
@Crusader Thực sự không có vấn đề gì ở đây, vì cả hai đều tham chiếu đến cùng một trường hằng số ( JFramekế thừa từ Frame).
Guillaume Polet

18

Cái gì đó như 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);
    }
}

Để làm gì |? Nó có làm được một, và nếu thất bại, nó có làm được không? Hay bạn chỉ ra lựa chọn lập trình viên (tức là chọn một trong A | B để thực hiện cuộc gọi này?) Tôi chưa từng thấy cú pháp này trước đây.
Pureferret

@ Pureferret nó là toán tử "bao gồm cả bit OR", sao chép một chút nếu nó tồn tại trong một trong hai toán hạng. ( docs.oracle.com/javase/tutorial/java/nutsandbolts/… hoặc tutorialspoint.com/java/java_basic_operators.htm )
VonC

14

Nếu bạn đang sử dụng JFrame, hãy thử cái này

JFrame frame = new JFrame();
//...
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);


2

tôi thích phiên bản này:

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);
    }
}

Tôi yêu phiên bản này. Cảm ơn bạn rất nhiều.
SWIIWII

2

Cách đặt JFrame thành toàn màn hình, là đặt MAXIMIZED_BOTHtùy chọn viết tắt của MAXIMIZED_VERT | MAXIMIZED_HORIZ, tương ứng đặt khung để tối đa hóa theo chiều dọc và chiều ngang

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);
    }
}

2

Tôi đã thử các giải pháp trong chuỗi này và các giải pháp ở đây , nhưng việc gọi đơn giản setExtendedState(getExtendedState()|Frame.MAXIMIZED_BOTH);ngay sau khi gọi setVisible(true);dường như không hoạt động đối với môi trường của tôi (Windows 10, JDK 1.8, thanh tác vụ của tôi nằm ở bên phải màn hình của tôi). Làm theo cách này vẫn để lại một khoảng trống nhỏ ở bên trái, bên phải và bên dưới.

Tuy nhiên, những gì đã làm việc cho tôi, đang gọi setExtendedState(...khi cửa sổ được kích hoạt, như vậy:

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);
                }
            }
        );
    }
}

1
Tôi đã gặp sự cố tương tự trên Windows 10 với thanh tác vụ ở cuối màn hình. Cửa sổ quá cao và do đó bị thanh tác vụ chồng lên nhau. Giải pháp của bạn đã hiệu quả!
tiện lợi: Bài viết

0

Tôi đã kết thúc bằng cách sử dụng mã này:

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);
    }
}

Tùy chọn này hoạt động tốt nhất trong tất cả các tùy chọn, bao gồm hỗ trợ nhiều màn hình. Lỗ hổng duy nhất này có là phần bù thanh tác vụ được sử dụng trên tất cả các màn hình là một số cấu hình.


0

Câu trả lời của @kgiannakakis là hoàn toàn chính xác, nhưng nếu ai đó gặp sự cố này và sử dụng Java 6 trên Linux (ví dụ: Mint 19 Cinnamon), trạng thái MAXIMIZED_BOTH đôi khi không được áp dụng.

Bạn có thể thử gọi phương thức pack () sau khi thiết lập trạng thái này.

Ví dụ về mã:

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();
}

Điều này là không cần thiết nếu bạn đang sử dụng Java 7+ hoặc Java 6 trên Windows.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.