2009-11-05 6 views
3

간단히 말해, 전 화면으로 작업하고있는 게임을 만들려고합니다.JPanels, JFrames 및 Windows, 오 마이!

I가 내가 사용하려고 다음 코드를이와

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice gs = ge.getDefaultScreenDevice(); 
if(!gs.isFullScreenSupported()) { 
    System.out.println("full-screen not supported"); 
} 

Frame frame = new Frame(gs.getDefaultConfiguration()); 
Window win = new Window(frame); 

try { 
    // Enter full-screen mode 
    gs.setFullScreenWindow(win); 
    win.validate(); 
} 

문제는 내가 JPanel의를 확장하는 클래스 내에서 작동하고, 나는 타입 프레임의 변수를 가지고있는 동안, 나는 아무도이 없다는 것입니다 클래스 내의 Window 타입.

JPanel에 대한 이해는 그것이 일종의 윈도우라는 것을 이해하지만 gs.setFullScreenWindow (Window win)에 'this'를 전달할 수는 없습니다 ... 어떻게해야합니까?

JPanel을 사용하여 쉽게 호출하거나 비슷한 방법으로 호출 할 수 있습니까?

내 JPanel에서 Window 유형을 얻을 수있는 방법이 있습니까?

-

편집 : 다음 방법은 JFrame의 상태를 변경하고 10ms마다라고합니다 :

나는 경우 (g = 후 몇 중복 또는 불필요한 호출이있을 수 있습니다 것으로 예상
public void paintScreen() 
{ 
    Graphics g; 
    try{ 
     g = this.getGraphics(); //get Panel's graphic context 
     if(g == null) 
     { 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setExtendedState(frame.getExtendedState()|JFrame.MAXIMIZED_BOTH); 
      frame.add(this); 
      frame.pack(); 
      frame.setResizable(false); 
      frame.setTitle("Game Window"); 
      frame.setVisible(true); 
     } 
     if((g != null) && (dbImage != null)) 
     { 
      g.drawImage(dbImage, 0, 0, null); 
     } 
     Toolkit.getDefaultToolkit().sync(); //sync the display on some systems 
     g.dispose(); 
    } 
    catch (Exception e) 
    { 
     if(blockError) 
     { 
      blockError = false; 
     } 
     else 
     { 
      System.out.println("Graphics context error: " + e); 
     } 
    } 
} 

= null) (모든 frame.somethingOrOther() s) 문, 클린업 조언을 주시면 감사하겠습니다 ...

또한 블록 오류가 발생합니다. 나는 오류를 무시하고있다. 오류는 한 번만 발생하며이 오류는 설치가 오류의 첫 번째 인스턴스를 무시할 때 올바르게 작동합니다 ... 누군가 관심이있는 사용자라면 해당 블록을 제거 할 수 있는지보고 싶다면 추가 정보를 게시 할 수 있지만 우려하지는 않습니다. ... 나중에 살펴볼 수 있습니다.

답변

2

이 문제와 관련하여 진전을 보았습니까? 예상되는 행동으로 질문을 업데이트 할 수 있고 실제로 코드가 수행하는 작업이 도움이 될 수 있습니다. 이미 지적했듯이 JFrame은 Window의 하위 클래스이므로 JFrame이 있으면 Window가 필요하지 않습니다.

가치가있는 것을 위해 전체 화면 모드에서 작동하는 Java 앱이 있습니다. 화면이 자주 화면에 다시 그려지지는 않지만 정기적으로 다시 그려집니다. 난 그냥 container 인 JPanel에 새로운 JPanel의 연결, 나는 화면을 업데이트해야 할 때마다 다음

// pseudo-code; not compilable 

JPanel container = new JPanel(); 
container.setOpaque(true); // make sure the container will be visible 

JFrame frame = new JFrame(); 
frame.getContentPane().add(container); // add the container to the frame 
frame. ... //other initialization stuff, like default close operation, maximize, etc 

if (fullScreenModeIsSupported) 
    frame.setUndecorated(true); // remove window decorations from the frame 
    gs.setFullScreenWindow(frame); 
    frame.validate(); 

:

// pseudo-code; not compilable 

container.removeAll(); // clean out the container 
container.add(jPanelWithNewDisplay); // add the new display components to the container 
container.validate(); // update and redisplay 
container.repaint(); 

가 기술적으로 완벽 주장 할 수 없습니다 나는 전체 화면을 입력 다음을 수행 ,하지만 그것은 나를 위해 잘 작동합니다. 의사 코드 예제가이를 자르지 않으면 컴파일 가능한 예제를 작성하는 데 시간을 할애 할 수 있습니다.

-1

당신이 그렇게 생각하는 이유 인 JPanel의 나의 이해는 이 종류

의 창이라는 것이다? API를 읽었습니까? JPanel은 Window에서 확장됩니까?

SwingUtilities 클래스를 사용해 볼 수 있습니다. 지정된 컴퍼넌트의 Window를 돌려주는 메소드를가집니다.

+0

나는 API를 읽었지만 JFrame과 JPanel (오스카가 지적한 바와 같이)이 섞여있다. 내 실수. – Jonathan

0

JPanelWindow의 하위 클래스가 아닙니다. JFrame입니다.

그래서 당신은 시도 할 수 :

JFrame yourFrame = new JFrame(); 
yourFrame.add(yourPanel); 

appyYourFullScreenCodeFor(yourFrame); 

작동합니다 그.

+0

이것이 작동하지 않는 것 같지만, 원래의 질문에 추가 한 방법에 부분적으로 영향을 미칠 수 있다고 생각합니다. 이 메서드는 매 10ms마다 호출되고 내 JFrame의 상태를 엉망으로 만듭니다. – Jonathan

0

내가 필요한 것을 얻었습니다.

  1. 는 프레임이 장식을 가지지 설정 때문에 는 제목 표시 줄 및 물건없이 제공됩니다.

  2. 패널에 프레임을 추가하십시오. 따라서 은 패널 만 표시되는 것처럼 보입니다.

  3. 프레임을 최대화하십시오.따라서 이제 은 전체 패널을 및 창문없이 가져 오는 패널처럼 보입니다.

    frame.setUndecorated (true); frame.add (panel); // 이제 프레임을 최대화하십시오.

은 : 그것의 중요한 당신의 프레임이 비 표시하면 그 이미 보여 주면, 먼저 당신이 (거짓)로 setVisible를 할 필요가 있도록 꾸며지지 않은 API 만, 호출 할 수 있습니다합니다.

EDIT1 : 당신이 원하는 모든 당신의 패널을 포함하는 윈도우를 얻을 경우, 당신은이 작업을 수행 할 수 있습니다

Window win = SwingUtilities.getAncestorOfClass(Window.class, myPanel); 

당신이 윈도우 인스턴스를 일단 당신이 원하는 어디든지 당신이 그것을 전달할 수 있습니다.

EDIT2 : 또한 Frame 클래스는 Window 그래서 직접 gs.setFullScreen(frame)을 할 수있는 확장합니다. 해당 프레임에 대한 새 창을 만들 필요가 없습니다.

+0

@Jonathan,이게 당신의 문제를 해결할 수 없다면 말해줘 !! –

+0

나는 이것이 내가 필요한 것이라고 생각하지 않는다. 위에서 언급 한 코드는 솔루션이 제공하지 않는 몇 가지 효율성을 사용한다고 생각합니다. 특히, 내가 맞다면 마치 창이나 시뮬레이션 된 전체 화면 (솔루션)에있는 것처럼 작동하지 않습니다. 그것은 다른 모든 창의 위 및 작업 표시 줄 위에 최대화되거나 작업 표시 줄에 최소화됩니다. 이 방법은 맨 위에있는 다른 윈도우를 확인하고 다시 그리는 방법을 호출하는 것에 대해 걱정할 필요가 없습니다. 또한 더 깨끗해진다. 위의 코드를 실행하면 무슨 뜻인지 알 수 있습니다. – Jonathan

+0

@Jonathan ... 도움이된다면 답을 편집하십시오. 당신이 그리워 할 경우를 대비해서 코멘트에 게시하고 있습니다 : 패널을 포함하는 창을 얻고 싶다면 다음을 할 수 있습니다 : Window win = SwingUtilities.getAncestorOfClass (Window.class, myPanel); 당신이 원하는 곳마다 그것을 전달할 수있는 윈도우 인스턴스. –