2

我正在制作一个简单的 Java Swing GUI 棋盘,玩家可以在其中拖放棋子。问题是,由于框架周围的边框(标题在顶部,最大化/最小化/关闭按钮等),坐标偏斜 - (0, 0) 是左上角框架,即 X 按钮上方一点,但 GUI 开始在标题栏下方自行构建,因此 GUI 与坐标不对齐,事情最终不会按应有的方式工作。此外,例如,当我将框架的大小设置为 100 x 100 时,我的 GUI 的下部和一些右侧部分被切断,因为框架没有补偿其边框。当我将它作为小程序运行时,我没有这个问题,但我不想那样做。

sscce:

import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class class1 extends JFrame{
    public class1(){
        addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent evt){
                System.out.print(evt.getPoint());
            }
        });
    }

    public static void main(String[] args){
        class1 c = new class1();
        c.setTitle("Test");
        c.setSize(320, 320);
        c.setLocationRelativeTo(null);
        c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        c.setVisible(true);
    }
}
4

1 回答 1

1

没有代码很难知道你的代码有什么问题,但我知道,如果你通过使用各种布局管理器来简单的方法,并让这些管理器为你完成组件的布局和事物的大小调整,包括pack()在 JFrame 上的调用,通常事情都会很容易就位。再说一遍,不要设置任何东西的大小,而是让组件的首选大小和布局管理器为你做这件事。

如果此建议没有帮助,请向我们提供更多信息和代码,最好是sscce,这是一个可编译和可运行的小型程序,除了演示您的问题外,它不会做任何事情。

编辑:我假设这是一个 Swing GUI。请验证是否是这样。

编辑 2:您遇到的一个问题是您设置 JFrame 的大小时没有考虑到它的“装饰”,包括菜单栏、调整大小/最大化/关闭图标。同样,您不应该直接设置大小,但如果您必须更好地覆盖getPreferredSize()保存网格的 JPanel 的方法。

编辑3:例如:

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

public class Grid extends JPanel {
   public static final Color DARK_COLOR = Color.red.darker().darker().darker();
   public static final Color LIGHT_COLOR = Color.lightGray.brighter();
   public static final int SQUARE_SIDE = 60;
   private static final int ROW_COUNT = 8;

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(ROW_COUNT * SQUARE_SIDE, ROW_COUNT * SQUARE_SIDE);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      for (int i = 0; i < ROW_COUNT; i++) {
         for (int j = 0; j < ROW_COUNT; j++) {
            Color c = (i % 2 == j % 2) ? LIGHT_COLOR : DARK_COLOR;
            g.setColor(c);
            int x = i * SQUARE_SIDE;
            int y = j * SQUARE_SIDE;
            g.fillRect(x, y, SQUARE_SIDE, SQUARE_SIDE);
         }
      }
   }

   public Grid() {
      // TODO Auto-generated constructor stub
   }

   private static void createAndShowGui() {
      Grid mainPanel = new Grid();

      JFrame frame = new JFrame("Grid");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }

}
于 2012-05-13T03:51:33.457 回答