2014-11-16 5 views
1

Я пытаюсь нарисовать точку, многоугольник и прямоугольник на том же JLabel, но не совсем уверен, как обращаться с методом paintComponent. В настоящее время я могу нарисовать точку и многоугольник отдельно, используя 2 разных класса, которые расширяют метку, но когда я пытаюсь поместить их в один класс, потому что мне нужно, чтобы оба они были на одном ярлыке, он начинает рисовать многоугольник и не делает позволяют нарисовать точку отдельно.рисование нескольких графических изображений на одном JLabel

Вот код; Мне нужна помощь в отладке кода.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.util.*; 

class Drawing { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Draw Everything"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new Test(new ImageIcon("map.JPG"))); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

class Test extends JLabel 
     implements MouseListener, MouseMotionListener { 

    private boolean polygonDrawn = false; 
    private final Point trackPoint = new Point(); 
    private static ArrayList polygonPoints = new ArrayList(); 
    private static Point point; 

    public Test(ImageIcon imageIcon) { 
     super(imageIcon, SwingConstants.LEFT); 
     addMouseListener(this); 
     addMouseMotionListener(this); 

    } 

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

     if (point != null) { 
      Double x = point.getX(); 
      Double y = point.getY(); 
      g.setColor(Color.RED); 
      g.fillOval(x.intValue(), y.intValue(), 5, 5); 
     } 

     int numPoints = polygonPoints.size(); 
     if (numPoints == 0) { 
      return; 
     } 

     Point prevPoint = (Point) polygonPoints.get(0); 

     Iterator it = polygonPoints.iterator(); 
     while (it.hasNext()) { 
      Point curPoint = (Point) it.next(); 
      draw(g, prevPoint, curPoint); 
      prevPoint = curPoint; 
     } 
     if (polygonDrawn) { 
      draw(g, prevPoint, (Point) polygonPoints.get(0)); 
     } else { 
      draw(g, prevPoint, trackPoint); 
     } 

    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(820, 580); 
    } 

    @Override 
    public void mouseClicked(MouseEvent evt) { 
     int x = evt.getX(); 
     int y = evt.getY(); 

     switch (evt.getClickCount()) { 
      case 1: // single-click 
       if (polygonDrawn) { 
        polygonPoints.clear(); 
        polygonDrawn = false; 
       } 
       polygonPoints.add(new Point(x, y)); 
       repaint(); 
       break; 

      case 2: // double-click 
       polygonDrawn = true; 
       polygonPoints.add(new Point(x, y)); 
       repaint(); 
       break; 

      default: 
       break; 
     } 
    } 

    @Override 
    public void mouseMoved(MouseEvent evt) { 
     trackPoint.x = evt.getX(); 
     trackPoint.y = evt.getY(); 
     repaint(); 
    } 

    private void draw(Graphics g, Point p1, Point p2) { 
     int x1 = p1.x; 
     int y1 = p1.y; 

     int x2 = p2.x; 
     int y2 = p2.y; 

     g.setColor(Color.RED); 
     g.drawLine(x1 + 3, y1 + 3, x2 + 3, y2 + 3); 

     g.setColor(Color.RED); 
     g.fillOval(x1, y1, 8, 8); 

     g.setColor(Color.RED); 
     g.fillOval(x2, y2, 8, 8); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     int x = e.getX(); 
     int y = e.getY(); 
     point = new Point(x, y); 
     repaint(); 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 

    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 

    } 
} 
+0

1) Для лучшей помощи раньше, опубликовать [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример). 2) Единственная пустая строка пробела в исходном коде - это все, что требуется *. Пустые строки после '{' или before '}' также типично избыточны. –

+0

Прошу прощения, Андрей, я забыл добавить основной класс. Код теперь редактируется. – deek25

+0

Вы можете изучить приведенный здесь пример [здесь] (http://stackoverflow.com/a/11944233/230513) для примеров выбора и перетаскивания фигур в панели. – trashgod

ответ

0

Это не совсем понятно, что вы хотите достичь, но обратите внимание, что при рисовании многоугольника, вы рисуете в последний фиксированный многоугольник точку на том же месте, как при рисовании точки. Чтобы увидеть это, увеличить размер точки с

g.fillOval(x.intValue(), y.intValue(), 10, 10); 

и рисовать многоугольник с другим цветом в методе Draw:

g.setColor(Color.BLUE); 
+0

Я знаю об этой проблеме, и это то, что я пытаюсь исправить. Я хочу нарисовать точку сначала, а затем после того, как будет нарисована точка. В другом случайном месте я должен иметь возможность рисовать многоугольник и, в конечном счете, в другом случайном месте на JLabel я должен иметь возможность рисовать прямоугольник. Как я могу нарисовать эту множественную графику на одном JLabel на разных позициях. Однако места для каждого из них не фиксированы, пользователь может рисовать в любом месте. – deek25

+0

Ну, я бы представил переменную состояния (например, перечисление), чтобы отслеживать, что делает пользователь в настоящее время, и соответственно рисует в paintComponent. И в mouseListener я бы справился с этой переменной состояния. – lbalazscs

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