프레임이 보이게 된 후 setUndecorated ()를 호출하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/875132

  •  22-08-2019
  •  | 
  •  

문제

스윙 애플리케이션에서는 전체 프레임을 재현하지 않고 장식 및 미개화를 전환 할 수있는 기능을 원합니다. 그러나 API는 전화를 걸지 못하게합니다 setUndecorated() 프레임이 보이게 된 후.

내가 전화하더라도 setVisible(false), isDisplayable() 여전히 사실을 반환합니다. API는 프레임을 공연 할 수없는 유일한 방법은 그것을 재창조하는 것입니다. 그러나 나는 일부 타이틀 막대를 끄기 위해 프레임을 재현하고 싶지 않습니다.

전체 화면과 창 모드 사이에서 전환 할 수있는 전체 화면 응용 프로그램을 만들고 있습니다. 상태를 유지하는 동안 전환 할 수 있어야합니다.

프레임이 보이면 어떻게합니까?.

도움이 되었습니까?

해결책

당신은 할 수 없습니다. 그것은 내가 똑같이 달성하려고 할 때의 경험이었습니다.

그러나 프레임에있는 하나의 패널에 전체 UI가있는 경우 새 프레임을 만들고 해당 패널을 프레임에 추가 할 수 있습니다. 그다지 많은 일이 아닙니다.

이 같은:

// to start with
JPanel myUI = createUIPanel();
JFrame frame = new JFrame();
frame.add(myUI);

// .. and later ...

JFrame newFrame = new JFrame();
newFrame.setUndecorated();
newFrame.add(myUI);

스윙에서 패널 (및 실제로 구성 요소 인스턴스)은 한 번에 한 번의 프레임에만있을 수 있으므로 새 프레임에 추가하면 즉시 이전 프레임에있는 것이 중단됩니다.

다른 팁

당신은 전화를 시도 했습니까? Frame.dispose() 그리고 그것을 바꾸나요? 직접 시도하지는 않았지만 효과가있을 수 있습니다.

그렇지 않다면, 당신이 할 수있는 일은 프레임에 클래스의 중요하지 않은 부분을 갖는 것입니다. 가장 높은 레벨 패널이나 패널에 가장 최소한의 고리 만 있으면 새로운 프레임으로 이동하는 것입니다. 모든 아이들이 따를 것입니다.

살펴보십시오 https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/mainframe.java

방법에서 switchFullscreenMode():

dispose();
...
setFullScreenWindow(...);
setUndecorated(true/false);
setBounds(mXPos, mYPos, mWidth, mHeight);
...
setVisible(true);

실제로 마우스가 측면에 닿으면 다시 나타나는 다양한 사이드 패널을 숨기려고 더 많은 것들이 있습니다.

또한 경계를 명시 적으로 설정해야합니다. Window.setExtendedState(MAXIMIZED_BOTH) Dispose () 근처에 적시에 심하게 방해합니다. 왜냐하면 그들은 분실 된 운영 체제의 여러 기본 사건에 의존하기 때문입니다.

기본 화면을 직접 가져 오는 것이 좋습니다.

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

대신 화면을 사용하면 JFrame이 현재 켜져 있습니다.

setBounds(getGraphicsConfiguration().getBounds());
getGraphicsConfiguration().getDevice().setFullScreenWindow(this);

현재는 동일하지만 앞으로는 변할 수 있습니다.

부름 dispose() 기본 창 자원을 출시합니다. 그런 다음 미색 등과 같은 속성을 편집 할 수 있습니다. 그런 다음 전화하십시오 setVisible(true) 창자 자원을 재현하고 모든 것이 잘 작동합니다 (포지션과 모든 구성 요소는 변경되지 않음).

dispose();
setUndecorated(true/false);
setVisible(true);

글쎄, 당신은 다른 프레임 인스턴스가 필요할 것입니다. 그것을 재현하지 않고 프레임의 내용을 움직일 수 있습니다. 여기서 핵심은 코드가 특정 프레임에 의존하지 않도록하는 것입니다. 이것은 어쨌든 기본적인 모범 사례입니다.

노력하다:

dispose();
setUndecorated(true);
setVisible(true);

확인 해봐. 도움이되기를 바랍니다 !!

다음은 만드는 방법에 대한 코드입니다 대체 + 입력하다 막대 모드없이 전체 화면을 입력하고 제목 표시 줄과 시작 막대를 표시하여 최소화합니다.

public class myTest extends JFrame{
 //Your codes...
     //if "ALT" key on hold and "Enter" key pressed with it
     if (evt.isAltDown() && evt.getKeyCode() == evt.VK_ENTER) {    
         //if the JFrame has Title bar
         if (isUndecorated()) {
             //this will dispose your JFrame
             dispose();
             //here to set it with no Title bar
             setUndecorated(false);
             pack();
             setLocationRelativeTo(null);
             //as you dispose your JFrame, you have to remake it Visible..
             setVisible(true);
          } else {
             dispose();
             setUndecorated(true);
             setExtendedState(MAXIMIZED_BOTH);
             setVisible(true);
        }
    }
//your codes
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top