JFrame trong Java toàn màn hình


110

Tôi sẽ sớm thực hiện một dự án và tôi sẽ phải sử dụng chế độ toàn màn hình trong đó.

Nó sẽ vẽ một số đồ họa trong cửa sổ. Sẽ rất thuận tiện nếu tôi sử dụng JFrame hoặc thứ gì đó tương tự.

Tôi không biết độ phân giải cuối cùng của màn hình sẽ là bao nhiêu. Xin vui lòng cho tôi biết nếu đồ họa sẽ được tự động thay đổi tỷ lệ?

JFrame jf = new JFrame();
jf.setSize(1650,1080);
//make it fullscreen;
//now is everything is going to be rescaled so it looks like the original?

Bạn cần xác định "toàn màn hình". Cùng với các câu trả lời dưới đây, bạn có thể cân nhắc xem khung có nên được trang trí hay không (bao gồm thanh tiêu đề và đường viền). Trừ khi bạn đang thực hiện sơn tùy chỉnh, việc thay đổi tỷ lệ sẽ không xảy ra. Nếu bạn đang sử dụng Swing Components và Layout manager thông thường, bạn sẽ thấy rằng bố cục điều chỉnh theo độ phân giải màn hình mới. Tất nhiên bạn sẽ muốn thử nghiệm nó;)
MadProgrammer

Bạn có muốn sử dụng Lion Fullscreen?
LanguagesNamedAfterCofee

Câu trả lời:


206

Thêm vào:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setUndecorated(true);
frame.setVisible(true);

52
Cũng frame.setUndecorated(true);sẽ làm cho nó thực sự toàn màn hình.
Yoda

Nếu đang sử dụng GNU / Linux, bạn có thể cần đặt DisplayMode.BIT_DEPTH_MULTIDisplayMode.REFRESH_RATE_UNKNOWNkhi áp dụng chế độ hiển thị mới. Tôi không cần phải sử dụng setExtendedState. Kiểm tra công tác sử dụng Kubuntu 15.10 với Java 8.
code_dredd

Tôi đang sử dụng Java8, đối với tôi, undecorated là ngoại lệ và khi tôi loại bỏ undecorated, mã hoạt động tốt và cũng làm cho toàn màn hình.
shaILU

Tôi sẽ cho bạn biết lỗi và lý do. Tôi đã tạo một lớp AppFrame (với một số thuộc tính mặc định) và để tạo bất kỳ lớp nào làm JFrame, tôi chỉ cần mở rộng nó. Nó đã thiết lập có thể là true. Bây giờ ba dòng trên phải theo cùng một thứ tự, nếu hiển thị trước ExtendedState, bạn sẽ gặp lỗi bên dưới. Khi tôi sửa lỗi tự biến mất và bạn sẽ có được JFrame không có thanh tiêu đề .........Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU

@shaILU đưa tất cả những gì vào một câu hỏi mới với một ví dụ tái sản xuất tối thiểu
Reimeus

39

Nếu bạn muốn đặt khung hình của mình ở chế độ toàn màn hình (như phim ở chế độ toàn màn hình), hãy kiểm tra các câu trả lời sau.

Các lớp java.awt.GraphicsEnvironmentjava.awt.GraphicsDeviceđược sử dụng để đặt một ứng dụng ở chế độ toàn màn hình trên một màn hình (không phân biệt).

ví dụ:

static GraphicsDevice device = GraphicsEnvironment
        .getLocalGraphicsEnvironment().getScreenDevices()[0];

public static void main(String[] args) {

    final JFrame frame = new JFrame("Display Mode");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setUndecorated(true);

    JButton btn1 = new JButton("Full-Screen");
    btn1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            device.setFullScreenWindow(frame);
        }
    });
    JButton btn2 = new JButton("Normal");
    btn2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            device.setFullScreenWindow(null);
        }
    });

    JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    panel.add(btn1);
    panel.add(btn2);
    frame.add(panel);

    frame.pack();
    frame.setVisible(true);

}

@Paul Vargas: Bạn thậm chí có thể thêm thanh menu trên một cửa sổ chưa được trang trí. Để thoát, trong ví dụ của bạn, bạn phải nhập "alt + F4".
cardman


7

Một cách là sử dụng Trạng thái Mở rộng. Điều này yêu cầu hệ điều hành bên dưới tối đa hóa JFrame.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

Cách tiếp cận khác sẽ là tối đa hóa màn hình theo cách thủ công theo yêu cầu của bạn.

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight());
setLocationRelativeTo(null);

Nhưng điều này có những cạm bẫy trong hệ điều hành Ubuntu. Công việc xung quanh tôi tìm thấy là thế này.

if (SystemHelper.isUnix()) {
    getContentPane().setPreferredSize(
    Toolkit.getDefaultToolkit().getScreenSize());
    pack();
    setResizable(false);
    show();

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            Point p = new Point(0, 0);
            SwingUtilities.convertPointToScreen(p, getContentPane());
            Point l = getLocation();
            l.x -= p.x;
            l.y -= p.y;
            setLocation(p);
        }
    });
}

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(100, 100, (int) dim.getWidth(), (int) dim.getHeight());
setLocationRelativeTo(null);

Ở Fedora, vấn đề trên không hiện hữu. Nhưng có những phức tạp liên quan đến Gnome hoặc KDE . Vì vậy, tốt hơn hãy cẩn thận. Hi vọng điêu nay co ich.


6

Sửa chữa dễ dàng nhất từ ​​trước đến nay:

for ( Window w : Window.getWindows() ) {
    GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow( w );
}

Sự khác biệt giữa betweend frame.setExtendedState(JFrame.MAXIMIZED_BOTH);và giải pháp của bạn là gì?
Yoda,

Bạn phải có khung cho giải pháp của mình. Trong khi đó, đối với tôi bạn không và nó sẽ tự động lặp qua tất cả các cửa sổ trong chương trình
Ariel Terrani

Làm tốt. Bản sửa lỗi này thậm chí còn hoạt động tốt hơn đối với macOS, vì bản sửa lỗi khác sẽ vẫn giữ thanh menu hiển thị. Bản sửa lỗi này hoàn toàn ẩn mọi thứ. Đây phải là câu trả lời được chấp nhận.
Panayotis

5

Chỉ cần sử dụng mã này:

import java.awt.event.*;
import javax.swing.*;

public class FullscreenJFrame extends JFrame {
    private JPanel contentPane = new JPanel();
    private JButton fullscreenButton = new JButton("Fullscreen Mode");
    private boolean Am_I_In_FullScreen = false;
    private int PrevX, PrevY, PrevWidth, PrevHeight;

    public static void main(String[] args) {
        FullscreenJFrame frame = new FullscreenJFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 500);
        frame.setVisible(true);
    }

    public FullscreenJFrame() {
        super("My FullscreenJFrame");

        setContentPane(contentPane);

        // From Here starts the trick
        FullScreenEffect effect = new FullScreenEffect();

        fullscreenButton.addActionListener(effect);

        contentPane.add(fullscreenButton);
        fullscreenButton.setVisible(true);
    }

    private class FullScreenEffect implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (Am_I_In_FullScreen == false) {
                PrevX = getX();
                PrevY = getY();
                PrevWidth = getWidth();
                PrevHeight = getHeight();

                // Destroys the whole JFrame but keeps organized every Component
                // Needed if you want to use Undecorated JFrame dispose() is the
                // reason that this trick doesn't work with videos.
                dispose();
                setUndecorated(true);

                setBounds(0, 0, getToolkit().getScreenSize().width,
                        getToolkit().getScreenSize().height);
                setVisible(true);
                Am_I_In_FullScreen = true;
            } else {
                setVisible(true);
                setBounds(PrevX, PrevY, PrevWidth, PrevHeight);
                dispose();
                setUndecorated(false);
                setVisible(true);
                Am_I_In_FullScreen = false;
            }
        }
    }
}

Tôi hi vọng cái này giúp được.


2

nó sẽ giúp bạn sử dụng đối tượng của bạn ngay lập tức trong khung

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);


2

Trước hết, đó là độ phân giải bạn muốn sử dụng , 1650,1080.

Bây giờ thêm:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

Nếu bạn gặp sự cố với các thành phần trên JFrame, thì sau khi bạn đã thêm tất cả các thành phần bằng frame.add(component)phương pháp này, hãy thêm câu lệnh sau.

frame.pack();

1
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(Toolkit.getDefaultToolkit().getScreenSize()));

Điều này chỉ làm cho khung có kích thước của màn hình


1

Bạn có thể sử dụng công cụ thuộc tính.
Đặt 2 thuộc tính cho JFrame của bạn :

extendedState 6
resizeable    true

0

Bạn chỉ cần cái này:

JFrame frame = new JFrame();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

Khi bạn sử dụng công cụ sửa đổi MAXIMIZED_BOTH, công cụ này sẽ tối đa trên toàn bộ cửa sổ (chiều cao và chiều rộng).

Có một số đề xuất sử dụng cái này:

frame.setUndecorated(true);

Tôi sẽ không đề xuất nó, vì cửa sổ của bạn sẽ không có tiêu đề, do đó không có nút đóng / khôi phục / thu nhỏ.


0

Các giá trị được đánh dấu mà tôi muốn nói:

JFrame - Thuộc tính


trong khi hình ảnh có thể cung cấp một câu trả lời ngầm, vui lòng cũng cố gắng giải thích câu trả lời của bạn. Tuy nhiên, imho, vì câu trả lời của bạn thực sự giống với câu trả lời hiện có, hãy suy nghĩ kỹ xem bạn có thực sự muốn giải thích và giữ câu trả lời này hay không.
Yohanes Khosiawan 许先汉

-1

Đặt 2 thuộc tính bên dưới:

  1. ExtendedState = 6
  2. có thể thay đổi kích thước = true

Nó làm việc cho tôi.


2
Động tĩnh cuối cùng là có lý do.
Yoda

Hmmmm ... trong NetBeans 8.0.1 tôi có thể thiết JFrame cho các giá trị của "resizeable" + tính "resizeable" (các thuộc tính cửa sổ)
Rudi Wijaya
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.