矩形和椭圆形没有出现在我定位它们的确切位置?

时间:2011-12-13 20:10:50

标签: java swing graphics drawing java-2d

当我在程序中绘制线条时,位置是完美的,但是当我使用相同的坐标作为正方形或椭圆形时,它们就会偏离标记。我的代码是:

g2d.drawRect(one1, one2, two1, two2);
g2d.drawOval(one1, one2, two1, two2);

积分是:

one1 = (int)e.getX();
one2 = (int)e.getY();

这是question I previously asked的后续内容。

3 个答案:

答案 0 :(得分:3)

好吧,我得到了你的问题。如果您看到下图,则椭圆和sqaure采用的参数与线的不同。

画一条线 - >您必须指定起点和终点。只是将它们直接传递给Graphics对象就可以完成这项工作。然而对于Square或Oval来说,它是不同的。您首先单击将获取一个点,然后您应该对第二次单击时应该输出的内容进行一些操作。第二次单击不应被视为直接进入drawOval()或drawRect()方法的坐标。

因为这些方法的参数是

x, y, width, height

而你正在

x1, y1  and x2, y2

enter image description here

package sof;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class DrawTest {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Draw Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new MyComponent());
        frame.setSize(260, 280);
        frame.setVisible(true);
    }
}

class MyComponent extends JComponent {
    public void paint(Graphics g) {
        int height = 120;
        int width = 120;
        g.setColor(Color.black);
        g.drawOval(60, 60, width, height);
        g.drawRect(60, 60, width, height);
        g.drawLine(0,0,50,50);
    }
}

答案 1 :(得分:1)

我想我明白你的问题是什么。您让用户在画布上的两个不同位置单击,然后您想使用这些点绘制矩形/椭圆。因此,如果用户点击10,10然后点击20,20,则需要一个左上角为10,10且右下角为20,20的矩形。

如果这实际上是你要问的,那么这是我提出的解决方案:

Event e1 = (the first click)
Event e2 = (the second click)

// Figure out where the user clicked
int x1 = (int)e1.getX();
int y1 = (int)e1.getY();

int x2 = (int)e2.getX();
int y2 = (int)e2.getY();

int xCoord;
int yCoord;

// Figure out the coordinates
if(x1 < x2)
    xCoord = x1;
else
    xCoord = x2;

if(y1 < y2)
    yCoord = y1;
else
    yCoord = y2;

// Figure out the size of the object
int width = Math.abs(x1 - x2);
int height = Math.abs(y1 - y2);

// Finally draw your objects
g2d.drawRect(xCoord, yCoord, width, height);
g2d.drawOval(xCoord, yCoord, width, height);

根据我对你问题的理解,这应该适合你。

答案 2 :(得分:0)

我的猜测是你正在捕捉X&amp;容器的Y坐标(比如200,200)然后在NEW容器中创建椭圆/ rect;你在评论中陈述了JLabel。

如果您正在捕捉X&amp;对于JPanel,Y为200,200,然后创建JLabel并为组件分配X / Y为200,200,它是新组件中的坐标,而不是捕获X / Y的父级。

您是否可以发布启动MouseListener的代码以及创建JLabel的时间,如果这是错误的?正如其他人所说,我们需要更多的代码来工作。一个图像示例同样有益!