有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在ImagePanel上绘制形状

我是swing新手,我一直在关注Oracle网站上的教程。所以我有一个imagePanel类,使用它,我在JPanel上绘制一个图像。接下来,我需要在这张图像上绘制形状。因此,我调用imagePanel类的paintComponent方法中的drawShapes函数。我面临的问题是,无论何时我绘制任何形状,比如rectoval,它都不会根据我为y轴指定的位置绘制形状。它只考虑x轴。所以理想情况下

fillOval(30,70,10,10)等于fillOval(30,30,10,10) 我是做错了什么,还是有办法克服这个问题

    public class ImagePanel extends JPanel {
    private Image img;
    public ImagePanel(String loc)
    {
        this(new ImageIcon(loc).getImage());
    }

    public ImagePanel(Image img) {
        this.img = img;
        Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);    
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);
        renderShapes(g);
    }
private void renderShapes(g){
 Graphics2D g2d = (Graphics2D)g;
 g2d.fillOval(20,70,10,10);
 g2d.fillRect(120,40,10,10);    
}
}

编辑下面发布了所提供屏幕截图的renderShapes方法

 private void renderShapes(g){
     Graphics2D g2d = (Graphics2D)g;
     g2d.fillRect(220,50,10,10);
     g2d.fillRect(20,140,10,10);    
    }

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    您必须了解x、y坐标在Swing自定义图形中如何定位零部件

    试着理解下面的截图

    enter image description here


    在这里找到一个示例代码来理解相同的概念


    试着用这个示例代码来理解x和y坐标,使用10个像素分隔的网格,看看形状是否在正确的位置

    示例代码:

    class DrawPanel extends JPanel {
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            for (int i = 0; i < getHeight(); i = i + 10) {
                g.drawLine(0, i, getWidth(), i);
            }
            for (int i = 0; i < getWidth(); i = i + 10) {
                g.drawLine(i, 0, i, getHeight());
            }
    
            g.setColor(Color.RED);
            g.fillOval(20, 70, 10, 10);
            g.setColor(Color.GREEN);
            g.fillRect(120, 40, 10, 10);
        }
    }
    
    DrawPanel drawPanel = new DrawPanel();
    drawPanel.setBackground(Color.WHITE);
    

    快照:

    enter image description here


    编辑

    JComponent#getPreferredSize()代替setPreferredSize()

    阅读更多Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?