繁体   English   中英

Java,BorderLayout.CENTER,获取JPanel的宽度和高度

[英]Java, BorderLayout.CENTER, getting the width and height of the JPanel

我正在使用Swing和AWT(为听众)制作一个小程序。 我有一个问题,关于获取我的JPanel(名为Chess的类)的大小。 我的布局:

public class Main extends JFrame implements MouseListener, ActionListener{

    Chess chessPanel = new Chess ();
    JButton newGameButton = new JButton ("New Game");
    JButton loadGameButton = new JButton ("Load Game");
    JButton saveGameButton = new JButton ("Save Game");
    JButton exitButton = new JButton ("Exit");

    public static void main (String [] args) {
        new Main();
    }

    Main () {
        super ("Chess");
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(dim);
        setLocation(0,0);
        setUndecorated(true);

        chessPanel.addMouseListener(this);
        add(chessPanel, BorderLayout.CENTER);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout());


        newGameButton.addActionListener(this);
        loadGameButton.addActionListener(this);
        saveGameButton.addActionListener(this);
        exitButton.addActionListener(this);

        buttonPanel.add(newGameButton);
        buttonPanel.add(loadGameButton);
        buttonPanel.add(saveGameButton);
        buttonPanel.add(exitButton);

        add(buttonPanel, BorderLayout.SOUTH);

        setVisible(true);
    }

    // ... Code ...
}

正如您在代码中看到的那样,我在CENTER中有一个JPanel,几乎占据了整个屏幕。 在底部我有另一个JPanel(SOUTH),它有一排按钮。

我需要的是CENTER中的JPanel所需的大小。 当我调用从JPanel继承的getWidth(),getHeight()或getBounds()方法时,由于BorderLayout,它们都返回0。 知道如何获得真正的价值吗?

PS:屏幕总是占据整个屏幕,如果有帮助,永远不会调整大小。

您可能在渲染JPanel之前调用getWidth,因此它将为0.解决方案是渲染获取大小,例如在已保存的根容器上调用pack()或setVisible(true)之后这个JPanel。

此外,我建议不要在任何事情上调用setSize(),因为大多数标准布局管理器都会观察组件的首选大小,而不是大小,当你调用pack()告诉布局管理器做他们的事情时,设置的大小是通常被忽略了 如果需要特定大小,您可能希望通过覆盖其setPreferredSize方法使中心的JPanel设置自己的大小。 然后让JFrame及其持有的容器在调用pack时根据其布局管理器设置下注大小。

例如,

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

public class Main extends JFrame {

   Chess chessPanel = new Chess();
   JButton newGameButton = new JButton("New Game");
   JButton loadGameButton = new JButton("Load Game");
   JButton saveGameButton = new JButton("Save Game");
   JButton exitButton = new JButton("Exit");

   public static void main(String[] args) {
      new Main();
   }

   Main() {
      super("Chess");
      add(chessPanel, BorderLayout.CENTER);

      JPanel buttonPanel = new JPanel();
      buttonPanel.setLayout(new FlowLayout());

      buttonPanel.add(newGameButton);
      buttonPanel.add(loadGameButton);
      buttonPanel.add(saveGameButton);
      buttonPanel.add(exitButton);

      System.out.printf("chessPanel Size before rendering: %s%n", chessPanel.getSize());
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      add(buttonPanel, BorderLayout.SOUTH);
      pack();
      System.out.printf("chessPanel Size after rendering: %s%n", chessPanel.getSize());
      setLocationRelativeTo(null);
      setVisible(true);
   }

   // ... Code ...
}

@SuppressWarnings("serial")
class Chess extends JPanel {
   private static final int CHESS_WIDTH = 600;
   private static final int CHESS_HEIGHT = CHESS_WIDTH;
   private static final int MAX_ROW = 8;
   private static final int MAX_COL = 8;
   private static final Color LIGHT_COLOR = new Color(240, 190, 40);
   private static final Color DARK_COLOR = new Color(180, 50, 0);

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(CHESS_WIDTH, CHESS_HEIGHT);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      int panelWidth = getWidth();
      int panelHeight = getHeight();
      int sqrWidth = panelWidth / MAX_ROW;
      int sqrHeight = panelHeight / MAX_COL;
      for (int row = 0; row < MAX_ROW; row++) {
         for (int col = 0; col < MAX_COL; col++) {
            Color c = (row % 2 == col % 2) ? LIGHT_COLOR : DARK_COLOR;
            g.setColor(c);
            int x = (row * panelWidth) / MAX_ROW;
            int y = (col * panelHeight) / MAX_COL;
            g.fillRect(x, y, sqrWidth, sqrHeight);
         }
      }
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM