전체 화면 Java의 JFrame


110

곧 프로젝트를 진행할 예정이며 전체 화면 모드 를 사용해야 합니다.

창에 그래픽이 그려집니다. JFrame 이나 비슷한 것을 사용하면 편리 할 것 입니다.

화면의 최종 해상도가 어떻게 될지 모르겠습니다. 그래픽이 자동으로 크기가 조정되는지 알려주세요.

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?

"전체 화면"을 정의해야합니다. 아래 답변과 함께 프레임을 장식해야하는지 여부를 고려할 수 있습니다 (제목 표시 줄 및 테두리 포함). 사용자 지정 페인팅을 수행하지 않는 한 크기 조정이 발생하지 않습니다. 일반 스윙 구성 요소와 레이아웃 관리자를 사용하는 경우 레이아웃이 새 화면 해상도에 맞게 조정된다는 것을 알 수 있습니다. 물론 테스트하고 싶을 것입니다;)
MadProgrammer 2012

Lion 전체 화면을 사용 하시겠습니까?
LanguagesNamedAfterCofee

답변:


206

더하다:

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

52
또한 frame.setUndecorated(true);진정한 전체 화면으로 만들 것입니다.
Yoda

GNU / Linux를 사용 하는 경우 새 디스플레이 모드 를 설정 DisplayMode.BIT_DEPTH_MULTI하고 DisplayMode.REFRESH_RATE_UNKNOWN적용 해야 할 수 있습니다. 을 사용할 필요가 없었습니다 setExtendedState. Java 8과 함께 Kubuntu 15.10을 사용하여 작업을 테스트했습니다.
code_dredd

Java8을 사용하고 있습니다. 장식되지 않은 예외가 발생하고 장식되지 않은 코드를 제거하면 코드가 제대로 작동하고 프레임을 전체 화면으로 만들었습니다.
shaILU

오류와 이유를 알려 드리겠습니다. 하나의 AppFrame 클래스 (일부 기본 속성 포함)를 만들고 모든 클래스를 JFrame으로 만들기 위해 간단히 확장합니다. 그것은 true로 setVisible을 가지고 있습니다. 이제 세 줄 위의 순서는 동일해야합니다. 표시가 ExtendedState 이전에 있으면 아래 오류가 발생합니다. 내가 수정하면 주문 오류가 사라 당신은 어떤 제목 표시 줄에 JFrame의를 얻을 .........Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923)
shaILU

기호가있는 새로운 질문에 모든 것을 넣어 @shaILU 최소한의 재현 예
Reimeus

39

프레임을 전체 화면 모드 (예 : 전체 화면의 영화)로 설정하려면 다음 답변을 확인하십시오.

클래스 java.awt.GraphicsEnvironment및 클래스 java.awt.GraphicsDevice는 앱을 한 화면 (디 포지티브)에서 전체 화면 모드로 전환하는 데 사용됩니다.

예 :

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 : 장식되지 않은 창에 메뉴 모음을 추가 할 수도 있습니다. 종료하려면 "alt + F4"를 입력해야합니다.
cardman


7

한 가지 방법은 확장 상태를 사용하는 것입니다. 이것은 기본 OS에 JFrame을 최대화하도록 요청합니다.

setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);

다른 접근 방식은 요구 사항에 맞게 화면을 수동으로 최대화하는 것입니다.

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

그러나 이것은 Ubuntu OS에 함정이 있습니다. 내가 찾은 일은 이것이었다.

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에서는 위의 문제가 없습니다. 그러나 Gnome 또는 KDE 와 관련된 복잡한 문제가 있습니다 . 그러니 조심하세요. 도움이 되었기를 바랍니다.


6

가장 쉬운 수정 :

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

d frame.setExtendedState(JFrame.MAXIMIZED_BOTH);와 솔루션 의 차이점은 무엇입니까 ?
Yoda

솔루션을위한 프레임이 있어야합니다. 광산 반면 당신은하지 않습니다 그것은 자동으로 프로그램의 모든 창을 통해 루프
아리엘 Terrani

잘 했어. 이 수정은 macOS에서 더 잘 작동합니다. 다른 수정은 여전히 ​​메뉴 막대를 계속 표시하기 때문입니다. 이 수정은 모든 것을 완전히 숨 깁니다. 이것은 받아 들여진 대답이어야합니다.
Panayotis

5

이 코드를 사용하십시오.

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

이게 도움이 되길 바란다.


2

그것은 당신이 프레임의 순간에 당신의 개체를 사용하는 데 도움이 될 것입니다

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);


2

우선 사용하려는 해상도 인 1650,1080.

이제 다음을 추가하십시오.

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

JFrame의 구성 요소에 문제가있는 경우 frame.add(component)메서드를 사용하여 모든 구성 요소를 추가 한 후 다음 문을 추가합니다.

frame.pack();

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

이것은 프레임을 화면 크기로 만듭니다.


1

속성 도구를 사용할 수 있습니다. JFrame에
대해 2 개의 속성을 설정합니다 .

extendedState 6
resizeable    true

0

다음 만 필요합니다.

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

MAXIMIZED_BOTH 수정자를 사용하면 창 전체 (높이 및 너비)에서 최대 값이됩니다.

이것을 사용하여 제안한 몇 가지가 있습니다.

frame.setUndecorated(true);

창에 헤더가 없으므로 닫기 / 복원 / 최소화 버튼이 없으므로 권장하지 않습니다.


0

강조 표시된 값은 다음을 의미합니다.

JFrame-속성


그림이 암묵적으로 대답을 제공 할 수 있지만, 몇 가지 설명과 함께 대답을 정교하게 작성하십시오. imho,하지만 당신의 대답은 실제로는 기존의 대답과 같기 때문에이 대답을 정말로 정교화하고 유지할 것인지 아닌지 신중하게 생각하십시오.
Yohanes Khosiawan 许先汉

-1

아래 2 개의 속성을 설정합니다.

  1. extendedState = 6
  2. 크기 조정 가능 = true

그것은 나를 위해 작동합니다.


2
최종 통계에는 이유가 있습니다.
Yoda 2014

흠 ...에서 넷빈즈 8.0.1 나는 "크기를 조정할 수"+ "크기를 조정할 수"속성 값 (속성 창)에 대한 JFrame의를 설정할 수 있습니다
루디 자야
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.