Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ImagePanel上绘制形状_Java_Swing_Jpanel_Graphics2d - Fatal编程技术网

Java 在ImagePanel上绘制形状

Java 在ImagePanel上绘制形状,java,swing,jpanel,graphics2d,Java,Swing,Jpanel,Graphics2d,我是swing新手,我一直在关注Oracle网站上的教程。因此,我有一个imagePanel类,使用它,我在JPanel上绘制图像。接下来,我需要在这张图像上绘制形状。因此,我调用imagePanel类的paintComponent方法中的drawShapes函数。我面临的问题是,无论何时我绘制任何形状,比如说rect或oval,它都不会根据我为y轴指定的位置绘制形状。它只考虑x轴。所以理想情况下 fillOval(30,70,10,10)相当于fillOval(30,30,10,10) 我是做

我是swing新手,我一直在关注Oracle网站上的教程。因此,我有一个imagePanel类,使用它,我在
JPanel
上绘制图像。接下来,我需要在这张图像上绘制形状。因此,我调用imagePanel类的
paintComponent
方法中的
drawShapes
函数。我面临的问题是,无论何时我绘制任何形状,比如说
rect
oval
,它都不会根据我为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);    
}
}
编辑下面发布了所提供屏幕截图的
渲染形状
方法

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


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

试着理解下面的截图


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


使用此示例代码,尝试使用由10个像素分隔的网格了解x和y坐标,并查看形状是否位于正确位置

示例代码:

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);
class DrawPanel扩展了JPanel{
@凌驾
公共组件(图形g){
超级组件(g);
g、 setColor(Color.BLUE);
对于(int i=0;i
快照:


编辑 使用而不是
setPreferredSize()


阅读更多内容

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

试着理解下面的截图


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


使用此示例代码,尝试使用由10个像素分隔的网格了解x和y坐标,并查看形状是否位于正确位置

示例代码:

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);
class DrawPanel扩展了JPanel{
@凌驾
公共组件(图形g){
超级组件(g);
g、 setColor(Color.BLUE);
对于(int i=0;i
快照:


编辑 使用而不是
setPreferredSize()



阅读更多

代码在我看来是合理的。发布一篇演示问题的文章。@camickr我已经添加了一个屏幕截图和相关代码,如果有帮助,请告诉我。屏幕截图不是
SSCCE
,因此没有帮助。我认为这不是您当前的屏幕截图code@AshwinGaneshK,它不是当前代码。如果不设置图形颜色,就不可能有两个不同颜色的矩形。SSCCE的目的是简化代码。您声明图形绘制位置不正确。我对此深表怀疑。问题在于你的代码。我们没有时间猜测您可能在做什么,或者不在做什么,这就是为什么您需要发布它。代码在我看来是合理的。发布一篇演示问题的文章。@camickr我已经添加了一个屏幕截图和相关代码,如果有帮助,请告诉我。屏幕截图不是
SSCCE
,因此没有帮助。我认为这不是您当前的屏幕截图code@AshwinGaneshK,它不是当前代码。如果不设置图形颜色,就不可能有两个不同颜色的矩形。SSCCE的目的是简化代码。您声明图形绘制位置不正确。我对此深表怀疑。问题在于你的代码。我们没有时间猜测你可能在做什么,也可能不在做什么,这就是为什么你需要发布它。OP了解x/y坐标。OP正在质疑为什么他的代码没有在指定的坐标处绘制。OP没有发布他正在执行的代码。是的,我也在查看OP代码。请给我一些时间。可能网格有助于OP理解x,y位置。@camickr,我理解-我将粘贴整个代码。只是不想用庞大的代码库让你们厌烦。@AshwinGaneshK,不,你们不明白。我没有要求您提供整个代码库。我要求一个
SSCCE。Braj发布了一个SSCCE。你发布你的版本。应该没有区别。将您的代码与Braj的代码进行比较,看看有什么不同。@camickr,着色函数有问题。你一直都是对的。我很抱歉惹你生气。OP知道x/y坐标。OP正在质疑为什么他的代码没有在指定的坐标处绘制。OP没有发布他正在执行的代码。是的,我也在查看OP代码。请给我一些时间。可能网格有助于OP理解x,y位置。@camickr,我理解-我将粘贴整个代码。只是不想用庞大的代码库让你们厌烦。@AshwinGaneshK,不,你们不明白。我没有要求您提供整个代码库。我要求一个
SSCCE。Braj发布了一个SSCCE。你