2017-10-18 13 views
0

IntelliJ의 최신 커뮤니티 에디션으로 개발중인 Windows 컴퓨터에서 Java8을 사용하고 있습니다. JFrame을 전체 화면으로 만들려면 다음과 같은 해결책을 찾았습니다.JFrame을 장식하지 않고 전체 화면으로보기

솔루션은 내가 JFrame의 전체 화면으로 만들기 위해 선 아래 세 가지를 넣어하는 데 필요한 솔루션에 따라 경찰 JFrame full screen

에서했다 : 내 프로젝트에서 내가 클래스 AppFrame.java을 만든

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

하지만 JFrame을 확장합니다. 그리고 기본 생성자에서 폰트 등의 기본 속성을 설정하고 사실에 대한 가시성을 중요하게 설정했습니다. A와

Exception in thread "main" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Frame.java:923) 

:

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

public class AppFrame extends JFrame { 

    AppFrame() { 
     Font baseFont = new Font("Dialog", Font.PLAIN, 12); 
     setFont(baseFont); 
     setLocationRelativeTo(null); 
     setBackground(Color.WHITE); 
     setForeground(Color.black); 
     setLayout(new FlowLayout()); 
     setVisible(true); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    } 
} 

그리고 나는 그것이 오류가 아래 얻을 극대화하기 위해 (또는 이미 AppFrame에서오고는, setVisible없이) 세 줄 위에 넣을려고 할 때 AppFrame를 확장 클래스

솔루션의 일부 (내가 확인하고 싶습니다) - 실험적으로 AppFrame.java에서 setVisible (true)을 제거하고 작동했지만 AppFrame을 확장하는 모든 클래스에 영향을 미칠 수 있으므로 frame.setUndecorated(true);을 클래스에서 제거하고 setVisible AppFrame에서. 그리고 예외는 사라졌습니다. 또한 frame.setUndecorated(true); 나는 JFrame의 제목 표시 줄을 제거한다고 생각합니다. 누군가가이 동작을 확인할 수있는 경우

A frame may have its native decorations (i.e. Frame and Titlebar) turned off with setUndecorated. This can only be done while the frame is not displayable.

그것은 좋은 것 :

또한, 아래의 javadoc에서 JFrame의의 발췌입니다.

+2

확인하려는 내용을 잘 모르겠다. 설명서가 매우 명확합니다. – MadProgrammer

+2

* "AppFrame.java에서 setVisible (true)을 삭제했습니다."* - I 보이는 것이 만들어 져야하는지에 대한 결정을 내리는'AppFrame'까지는 안되기 때문에 이것은 좋은 일이라고 주장 할 것입니다. 그것은 어린이 클래스에 가장 적합한 구현 세부 사항입니다. – MadProgrammer

+1

창을 최대화하고 싶다면 ['setExtendedState'] (https://docs.oracle.com/javase/8/docs/api/java/awt/Frame.html#setExtendedState-int-) – MadProgrammer

답변

0

setUndecorated은 전에 setVisible보다 먼저 호출해야합니다. 따라서 기본 클래스 호출 인 setVisible을 제거하고 하위 클래스에서 매번 호출해야합니다.

+0

도 사용할 수 있습니다. invokeLater의 생성자 외부에서 setVisible을 호출합니다. –

+0

"다른 선택 없음"은 내 대답에 의해 강조 표시된 부정확 한 진술입니다.0 매개 변수 이니셜 라이저는 ASM이 포함 된 프로그래밍 언어의 요구 사항은 아닙니다. – Wayne

0

매개 변수를 사용하도록 초기화 프로그램을 수정하십시오. 안부에서

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

public class AppFrame extends JFrame { 

    AppFrame(boolean undecorated, boolean visible) { 
     Font baseFont = new Font("Dialog", Font.PLAIN, 12); 
     setFont(baseFont); 
     setLocationRelativeTo(null); 
     setBackground(Color.WHITE); 
     setForeground(Color.black); 
     setLayout(new FlowLayout()); 
     setExtendedState(JFrame.MAXIMIZED_BOTH); 
     setUndecorated(undecorated); 
     setVisible(visible); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    } 
} 

에 :

A frame may have its native decorations (i.e. Frame and Titlebar) turned off with setUndecorated. This can only be done while the frame is not displayable.

이 바로 당신이해야 할 것을 주장한다 AppFrame() {setUndecorated(undecorated); 및 완료 setVisible(visible);

해결 한 후 초기화를 추가 AppFrame(boolean undecorated, boolean visible) {로 변경해야 setVisible(true);에 전화하기 전에 setUndecorated을 안전하게 호출 할 수 있는지 확인하려면 if (!isDisplayable()) { ... }