Прямоугольник и Овал не появляются точно, где я их размещаю? - PullRequest
0 голосов
/ 14 декабря 2011

Когда я рисую линии в моей программе, положение идеально, но когда я использую те же самые координаты для квадрата или овала, они далеко от знака.Мой код:

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

И очки набираются по:

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

Это продолжение вопроса , который я ранее задавал .

Ответы [ 3 ]

3 голосов
/ 14 декабря 2011

Хорошо, я понял, в чем твоя проблема.Если вы видите изображение ниже, то, как параметры, взятые овалом и квадратом, отличаются от линии.

Чтобы нарисовать линию -> Вам нужно будет указать начальную точку и конечную точку.Простая передача их непосредственно объекту Graphics сделает эту работу за вас.Однако для Квадрата или Овала это не так.Ваш первый щелчок захватит точку, а затем вы должны сделать некоторые манипуляции с тем, что должно быть на выходе, когда вы делаете второй щелчок.Второй щелчок не следует рассматривать как координату в методах 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 голос
/ 14 декабря 2011

Мне кажется, я понимаю, в чем твоя проблема. У вас есть пользователь щелкает в двух разных местах на холсте, а затем вы хотите нарисовать прямоугольник / овал, используя эти точки. Поэтому, если пользователь щелкает 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);

Это должно сработать для вас, исходя из моего понимания вашего вопроса.

0 голосов
/ 14 декабря 2011

Я предполагаю, что вы захватываете координаты X и Y для контейнера (скажем, 200 200), а затем создаете овал / прямоугольник в новом контейнере;Вы указали JLabel выше в своем комментарии.

Если вы захватываете X & Y для 2000000 для JPanel, то создаете JLabel и присваивает компоненту X / Y 200 200, это координата в пределах егоновый компонент, а не родительский, в котором вы захватили X / Y.

Можете ли вы опубликовать код, в котором инициируется MouseListener, а также когда создается JLabel, если это не так?Как уже говорили другие, нам нужно больше кода для работы.Пример изображения будет одинаково полезен!

...