【问题标题】:Swing Game, How can I place game window layout?Swing Game,如何放置游戏窗口布局?
【发布时间】:2017-05-30 10:48:27
【问题描述】:

我正在使用 Swing 制作俄罗斯方块,我想将游戏板放置在屏幕中间,尺寸固定,旁边有 1 或 2 个面板。 我想让俄罗斯方块游戏从 JFrame 中获得一些余量,并且如果可能的话,仍然从容器内的 0,0 位置开始。

目标:

我尝试将游戏添加到 JPanel 并使其居中,但游戏无法显示。

我的代码:

public class Window {

public Window(int width, int height, String title, Game game) {

    JFrame frame = new JFrame(title);
    frame.setPreferredSize(new Dimension(width, height));
    frame.setMaximumSize(new Dimension(width, height));
    frame.setMinimumSize(new Dimension(width, height));
    frame.setVisible(true);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.add(game);
    game.start();
}
} 

我找到但不起作用的居中固定布局:

JFrame Frame = new JFrame("CenterFrame");
    Frame.setLocation(0, 0);
    Frame.setSize(new Dimension(400, 400));// dim

    JPanel FixedPanel = new JPanel(new GridBagLayout());
    FixedPanel.setPreferredSize(Frame.getSize());

    JPanel myPanel = new JPanel();
    myPanel.setPreferredSize(new Dimension(100, 100));
    myPanel.setBackground(Color.BLACK);

    FixedPanel.add(myPanel);
    Frame.add(FixedPanel);
    Frame.setVisible(true);

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发帖 minimal reproducible exampleShort, Self Contained, Correct Example。 2) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。 3) “我找到的居中固定布局:” 这就是问题的解决方案吗?如果是这样,它不应该是问题的一部分,而是作为答案发布。 4) 我会为此使用两种方法之一 a) 将主 UI 放在 GridBagLayout 中,没有任何限制。 ..
  • .. 它将居中。 b) 为主 UI 分配一个空边框,将其添加到框架中,将框架设置为不可调整大小,然后打包顶级容器(窗口或框架)。
  • “我找到的居中固定布局但不起作用: 好的,这回答了第三点。它如何/为什么不起作用?
  • 您介意举个例子吗? JPanel 的居中固定布局代码甚至没有显示游戏。我不知道为什么。
  • “你介意展示一个例子吗?” 看到 MCVE/SSCCE 并且你澄清了顶部是否级别窗口可调整大小。

标签: java swing layout jpanel layout-manager


【解决方案1】:

这是你想要的吗?

private void initGameFrame(int gameWidth, int height, int scoreWidth, int border, String title) {
    //game frame
    JFrame frame = new JFrame(title);
    frame.setSize(new Dimension(gameWidth + scoreWidth, height));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.getRootPane().setBorder(BorderFactory.createLineBorder(Color.RED, 10));
    frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.X_AXIS));

    // Game panel
    JPanel gamePanel = new JPanel();
    gamePanel.setMinimumSize(new Dimension(0, 0));
    gamePanel.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
    gamePanel.setPreferredSize(new Dimension(gameWidth, height));
    gamePanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    gamePanel.setBackground(Color.BLUE);

    // Score panel
    JPanel scorePanel = new JPanel();
    scorePanel.setMinimumSize(new Dimension(0, 0));
    scorePanel.setMaximumSize(new Dimension(Short.MAX_VALUE / 2, Short.MAX_VALUE));
    scorePanel.setPreferredSize(new Dimension(scoreWidth, height));
    scorePanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    scorePanel.setBackground(Color.GREEN);

    // game canvas
    RunnableCanvas game = new RunnableCanvas(gameWidth, height);
    game.setMinimumSize(new Dimension(0, 0));
    game.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
    game.setBackground(Color.YELLOW);

    gamePanel.setLayout(new BorderLayout());
    gamePanel.add(game, BorderLayout.CENTER);

    frame.getContentPane().add(gamePanel);
    frame.getContentPane().add(scorePanel);
    frame.pack();
    frame.setVisible(true);

    // your real game thread should be here 
    Thread gameThread = new Thread(game);
    gameThread.start(); 
}

还有你的 Runnable Canvas:

public class RunnableCanvas extends Canvas implements Runnable {
    int width = 300;
    int height = 400; 

    public RunnableCanvas(int width, int height) {
      this.width = width;
      this.height = height;
    }

    @Override
    public void run() {
        System.out.println("Running");
    }

    @Override
   public Dimension getPreferredSize() {
       return new Dimension(width, height);
   }

   @Override
   public void paint(Graphics g) {
      g.setColor(Color.ORANGE);
      g.fillRect(0, 0, width, height);
   }
}

【讨论】:

  • 对于边距是可以的,但我希望将游戏添加到“myPanel”中。如果我添加“myPanel.add(game); game.start();”,它仍然不显示
  • 你的 Game 类是 JComponent 吗?
  • 不,我不这么认为,它扩展了 Canvas 并实现了 Runnable
猜你喜欢
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多