Java Graphics — отслеживание фигур

Итак, я делаю приложение и хочу отслеживать фигуры, добавленные на экран. Пока у меня есть следующий код, но когда круг добавлен, его нельзя переместить/изменить. В идеале я бы хотел, чтобы что-то вроде Shift-щелчка перемещало/выделяло его.

Мне также интересно, как я мог бы сделать так, чтобы можно было перетаскивать линию из одного круга в другой. Я не знаю, использую ли я неправильные инструменты для работы здесь, но любая помощь будет оценена по достоинству.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MappingApp extends JFrame implements MouseListener { 

  private int x=50;   // leftmost pixel in circle has this x-coordinate
  private int y=50;   // topmost  pixel in circle has this y-coordinate

  public MappingApp() {
    setSize(800,800);
    setLocation(100,100);
    addMouseListener(this); 
    setVisible(true);
  }

  // paint is called automatically when program begins, when window is
  //   refreshed and  when repaint() is invoked 
  public void paint(Graphics g) {
    g.setColor(Color.yellow);
    g.fillOval(x,y,100,100);

}

  // The next 4 methods must be defined, but you won't use them.
  public void mouseReleased(MouseEvent e ) { }
  public void mouseEntered(MouseEvent e)   { }
  public void mouseExited(MouseEvent e)    { }
  public void mousePressed(MouseEvent e)   { }

  public void mouseClicked(MouseEvent e) { 
    x = e.getX();   // x-coordinate of the mouse click
    y = e.getY();   // y-coordinate of the mouse click
    repaint();    //calls paint()
  }

  public static void main(String argv[]) {
    DrawCircle c = new DrawCircle();
  }
}

person Tim    schedule 28.06.2013    source источник


Ответы (3)


Используйте java.awt.geom.* для создания фигур, используйте поля для ссылки на них, а затем используйте графический объект для их рисования.

например:

Ellipse2D.Float ellipse=new Ellipse2D.Float(50,50,100,100);

graphics.draw(ellipse);
person Nikki    schedule 28.06.2013
comment
графика псевдо. Я имею в виду любой графический объект, который вы используете. В вашем примере используется «g» в качестве ссылки. Попробуйте g.draw() - person Nikki; 29.06.2013
comment
+1 за рисование фигурами. Однако класс Graphics не умеет рисовать фигуры. Вам нужно использовать класс Graphics2D. Также вы должны использовать метод fill(). Метод draw() просто рисует контур формы. Дополнительные сведения см. в разделе Игра с фигурами. - person camickr; 29.06.2013

1) См. этот ответ для щелчка/выбора нарисованных объектов и здесь для создания строк с помощью прессы, и перетащите мышь.

2) Вы не должны переопределять JFrame paint(..).

Скорее добавьте JPanel к JFrame и переопределите paintComponent(Graphics g) из JPanel, не забыв вызвать super.paintComponent(g); в качестве первого вызова в переопределенном методе:

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

   g.setColor(Color.yellow);
   g.fillOval(x,y,100,100);

}

Согласно paintComponent(Graphics g) документы:

Кроме того, если вы не вызываете реализацию super, вы должны учитывать свойство opaque, то есть, если этот компонент непрозрачен, вы должны полностью заполнить фон непрозрачным цветом. Если вы не соблюдаете свойство непрозрачности, вы, вероятно, увидите визуальные артефакты.

3) Не вызывайте setSize для JFrame, используйте правильный LayoutManager и/или переопределите getPreferredSize (обычно это делается при рисовании в JPanel, чтобы он мог соответствовать нашему графическому содержимому), а затем вызовите pack() для JFrame, прежде чем сделать его видимым.

4) Прочтите Concurrecny в Swing, особенно Event-Dispatch-Thread.

person David Kroukamp    schedule 28.06.2013
comment
Я только что заметил, что вы преодолели 20 тысяч! Поздравляю, это заслуженно. :) - person Andrew Thompson; 29.06.2013
comment
+1 хе-хе, спасибо, я чувствую, что могу сказать, что немного знаю о Swing :)! - person David Kroukamp; 29.06.2013

Вы расширяете JFrame, поэтому вам следует подумать о вызове super.paint(g); в начале переопределенного метода рисования.

person hujackus    schedule 28.06.2013