2013-04-25 3 views
-2

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

import java.awt.Rectangle; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent;  
import java.awt.event.MouseListener; 
import java.awt.geom.Point2D; 
import java.awt.geom.Point2D.Double; 
import java.util.ArrayList; 
import javax.swing.JFrame; 

public class DrawPolygonComponent { 

public static void main(String[] args) { 
    final JFrame frame = new JFrame(); 
    frame.setSize(300, 400); 
    frame.setTitle("Draw a Polygon"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    final ArrayList<Point2D.Double> path = new ArrayList(); 

    //addRectangle(frame, 10, 10); 
    // 

    class ClickListener implements MouseListener { 
     @Override 
     public void mouseClicked(MouseEvent me) { 
      if (path.isEmpty()) { 
       System.out.println("First"); 
       addRectangle(frame, me.getX(),me.getY()); 
       path.add(new Point2D.Double(me.getX(),me.getY())); 
      } else { 
       System.out.println("Second"); 
       Point2D.Double prev = path.get(path.size()-1); 
       addLine(frame, (int) prev.x, (int) prev.y,me.getX(),me.getY()); 
       path.add(new Point2D.Double(me.getX(),me.getY())); 


       frame.repaint(); 
      } 

     } 

     public void mousePressed(MouseEvent me) {} 
     public void mouseReleased(MouseEvent me) {} 
     public void mouseEntered(MouseEvent me) {} 
     public void mouseExited(MouseEvent me) {} 
    } 
    MouseListener listener = new ClickListener(); 
    frame.addMouseListener (listener); 
    frame.setVisible (true); 

} 
public static void addRectangle(JFrame frame, int x , int y) { 
    RectangleComponent r = new RectangleComponent(x, y, 10, 10); 
    frame.add(r); 
} 
public static void addLine(JFrame frame, int x1, int y1, int x2, int y2) { 
    LineComponent line = new LineComponent(x1, y1, x2, y2); 
    frame.add(line); 
} 

} 

/////////other 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import javax.swing.JComponent; 

public class LineComponent extends JComponent { 
private int px; 
private int py; 
private int x; 
private int y; 

public LineComponent(int px, int py, int x, int y){ 
    this.px=px; 
    this.py=py; 
this.x=x; 
this.y=y; 
} 

@Override 
public void paintComponent(Graphics g){ 
Graphics2D g2 = (Graphics2D)g; 
g2.drawLine(px,py,x,y); 
} 

} 


////////other 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import javax.swing.JComponent; 

public class RectangleComponent extends JComponent { 
private Rectangle box; 

public RectangleComponent(int x,int y, int l, int w){ 
box = new Rectangle(x,y,l,w); 
} 

public void paintComponent(Graphics g){ 
Graphics2D g2 = (Graphics2D)g; 
g2.fill(box); 
g2.draw(box); 
} 


} 
+0

Побольше Precission. Какая часть этого терпит неудачу? Как это происходит? Просто сбрасывая код и ожидая, что кто-то его решит, он не очень хорошо отражается на ваших усилиях. – SJuan76

+0

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

+0

Ну, это больше информации для начала ... нет эксперта с графическим интерфейсом, но вы добавляете компоненты в JFrame ... вам нужно переопределить метод JFrame 'paintComponent', а не добавлять компоненты с этим метод переоценивается. Когда вы добавляете их, JFrame пытается разобраться с ними как с разными объектами, каждый из которых имеет разные прямоугольные области. – SJuan76

ответ

1
  1. Вы прикрепил ваш слушатель мыши к рамке, но не предусмотрено никаких средств для кадра, чтобы нарисовать ваши пути ...
  2. компонент вы настроили на «по-видимому» нарисовать многоугольник не добавлено в рамку.

Вместо этого.

Создайте пользовательский компонент, используя что-то вроде JPanel. Прикрепите прослушиватель мыши к этому компоненту. Переопределить это метод paintComponent. Когда происходит событие мыши (которое должно генерировать новую строку), вызовите repaint, чтобы запросить обновление компонента.

Внутри метода paintComponent повторите рисование всех линий.

Посмотрите на Java Applet Polygon array и How can I draw a polygon using path2d and see if a point is within it's area? и drawPolygon keeps drawing lines from starting (mousePressed) location to current (mouseDragged) location для некоторых концептуальных идей

Ps Вы также можете, как проверить Performing Custom Painting

Смежные вопросы