2013-08-05 34 views
0

我有我的JFrame定义在主,我想这样做,如果我点击一个按钮,按F等,屏幕将全屏。我明白如何做到这一点,但我不明白如何让setFullScreenWindow的JFrame实例脱离主体,比如如何使用getter来获取玩家的x。你如何从主屏幕获取JFrame来制作全屏?

这里是我的代码示例:

private boolean fullscreen = false; 

public static void main(String args[]){ 
    Game game = new Game(); 

    //Set size of game (not shown) 

    JFrame frame = new JFrame(game.TITLE); 
    frame.add(game); 
    //JFrame setup stuff (not shown) 

    game.start(); 
} 

public void setFullScreen(JFrame frame){ 
    if(isFullScreenSupported){ 
     if(!fullscreen){ 
      frame.setUndecorate(true); 
      gd.setFullScreenWindow(frame); 
      frame.validate; 
     } else{ 
      gd.setFullScreenWindow(null); 
     } 
    } 
} 

我不能添加一个参数来启动(),顺便说一句。中间有一些复杂和必要的步骤。

回答

0

你的问题有点不清楚,但它听起来像你正在寻找切换窗口和全屏模式之间的JFrame。这里是一个自包含的例子,如何做到这一点:

package example.stackoverflow; 

import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class FullScreenExample 
{  
    static class GameFrame extends JFrame 
    { 
     private static final long serialVersionUID = 5386744421065461862L; 
     private static final GraphicsDevice gd = (GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices())[0]; 
     private static final boolean FULLSCREEN_SUPPORTED = gd.isFullScreenSupported(); 
     private static final String MAKE_FULLSCREEN_TEXT = "Make Full Screen"; 
     private static final String MAKE_WINDOWED_TEXT = "Make Windowed"; 
     private static final int WINDOWED_WIDTH = 400; 
     private static final int WINDOWED_HEIGHT = 300; 

     private final JButton fsButton = new JButton(MAKE_FULLSCREEN_TEXT); 
     private boolean isFullscreen = false; 

     public GameFrame(String title) 
     { 
      super(title); 
      setSize(WINDOWED_WIDTH, WINDOWED_HEIGHT); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      initComponents(); 
     } 

     public void initComponents() 
     { 
      setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); 
      if(FULLSCREEN_SUPPORTED) 
      { 
       fsButton.addActionListener(new ActionListener() 
       {  
        @Override 
        public void actionPerformed(ActionEvent e) 
        { 
         toggleFullscreen(); 
        } 
       }); 
       add(fsButton); 
      } 
      else 
      { 
       add(new JLabel("Fullscreen mode is not supported on this device")); 
      } 
     } 

     public void toggleFullscreen() 
     { 
      isFullscreen = !isFullscreen; 
      setVisible(false); 
      dispose(); 
      setUndecorated(isFullscreen); 
      if(isFullscreen) 
      { 
       fsButton.setText(MAKE_WINDOWED_TEXT); 
       gd.setFullScreenWindow(this); 
       validate(); 
      } 
      else 
      { 
       fsButton.setText(MAKE_FULLSCREEN_TEXT); 
       gd.setFullScreenWindow(null); 
       setVisible(true); 
      } 
     } 
    } 

    static class Game 
    { 
     private GameFrame gameFrame; 

     public Game(String title) 
     { 
      gameFrame = new GameFrame(title); 
     } 

     public void start() 
     { 
      SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        getGameFrame().setVisible(true); 
       } 
      }); 
     } 

     public GameFrame getGameFrame() 
     { 
      return gameFrame; 
     } 
    } 

    public static void main(String[] args) 
    { 
     Game g = new Game("Foo"); 
     g.start();   
    } 
} 
+0

谢谢你的帮助,但我明白如何使JFrame全屏。我需要知道如何让JFrame脱离主流,比如如何在其他类中使用getter和setter。 – user2653616

+0

@ user2653616:现在仍然很不清楚你想在这里完成什么。如果你想访问main()之外的JFrame对象,你必须将它作为参考存储在其他地方 - 例子将包括包含main(),你的Game(如上面编辑过的示例所示)的类,或者您可以从中检索它的一些其他对象。你不能只在main()中实例化它,而不是传递/存储对它的引用,并期望从其他范围使用它。 –

+0

对不起,我说错了。我想出我需要在外部声明JFrame,并在main()中使用game.frame来引用它。感谢您的尝试! – user2653616