首页 > 解决方案 > 关于覆盖jpanelpaintcomponent和相对位置

问题描述

我正在制作一个自定义的 jpanel,就像游戏的画布一样。我正在考虑使 JPanel 具有固定大小并使用 LayoutManager 使其与中心对齐。

但现在我有以下问题:如果我在我的自定义 JPanel 中画一些东西,比如,

@Override
public synchronized void paintComponent(Graphics g) {
 g.fillRect(0, 0, 10, 10);

}

我给 Graphics 对象的坐标是相对于我的 JPanel 左上角还是相对于窗口左上角的内部?(又名装饰中的矩形)

标签: javaswing

解决方案


这是我为另一个问题创建的一个简单的示例。

改变矩形的位置,看看它们在哪里结束。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ShapesExample extends JFrame {

    private static final long serialVersionUID = 1L;

    private List<Rectangle> rectangles;

    public ShapesExample() {
        rectangles = new ArrayList<>();
        rectangles.add(new Rectangle(10, 10, 20, 20));
        rectangles.add(new Rectangle(41, 41, 20, 20));
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Shapes Example");

        add(new DrawingPanel());
        
        pack();
        setLocationByPlatform(true);
        setVisible(true);
    }

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

    class DrawingPanel extends JPanel {

        private static final long serialVersionUID = 1L;
        
        public DrawingPanel() {
            this.setPreferredSize(new Dimension(300, 300));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.setColor(Color.RED);
            for (Rectangle rectangle : rectangles) {
                g.drawRect(rectangle.x, rectangle.y, 
                        rectangle.width, rectangle.height);
            }
        }
    }
}

推荐阅读