Проблема с графикой Java - PullRequest
       62

Проблема с графикой Java

1 голос
/ 25 октября 2011

У меня есть JComponent со слушателем.На JComponent я рисую большое изображение, а слушатель мыши добавляет маленькие изображения, где происходят щелчки (одна большая карта, на которой я добавляю несколько точек).

Как программно нарисовать что-то вне метода paintComponent?

 public void paintComponent(Graphics g) {
   Graphics2D g2 = (Graphics2D) g;

   g2.drawImage(img1, 0, 0, this);
   g2.finalize();

 }

 private MouseListener listener; 

 public void initListener() {
   myCanvas = this;
   listener = new MouseAdapter() {
     public void mouseClicked(MouseEvent e) {
       myCanvas.getGraphics().drawImage(img,e.getX(),e.getY(), myCanvas);
     }
   };
   addMouseListener(listener);

 }

Моя проблема с этим:

public void drawDot(int x, int y){
 myCanvas.getGraphics().drawImage(img, x, y, myCanvas);
}

Это ничего не делает.Я попытался перекрасить ().

Ответы [ 3 ]

2 голосов
/ 25 октября 2011

Вы должны управлять чертежом в методе paintComponent. Java Graphics не с состоянием , вы должны позаботиться о том, что вам действительно нужно, чтобы нарисовать все, что вы хотите внутри метода. Каждый раз, когда вызывается метод рисования, все должно быть нарисовано снова, на холсте нет ничего, что остается при добавлении других компонентов

Это означает, что вы должны хранить список элементов, которые будет рисовать метод рисования, например. ArrayList<Point> points, тогда в методе рисования вы должны выполнить их итерацию:

for (Point p : points)
  draw the point

так что вы просто добавляете точку в список с помощью слушателя и вызываете перерисовку. Вы можете найти рекомендации по рисованию Swing / AWT здесь ..

У определенного API есть поведение, которое вы хотели бы иметь, хотя оно называется Cocos2D и имеет порт для Android / Java, который вы можете найти здесь .

2 голосов
/ 25 октября 2011

Вы не можете сделать это. Все рисование происходит в методе paintComponent (). Что вы должны сделать, это построить модель, которая представляет то, что вы хотите нарисовать, и изменить модель в слушателе мыши. Затем вызовите repaint (), чтобы попросить перерисовать этот компонент при изменении модели. Внутри вашего метода paint () визуализируется полная краска из модели. Например:

List<Point> pointsToDrawSmallerImage = new ArrayList<Point>();

...

listener = new MouseAdapter() {
    public void mouseClicked(MouseEvent evt ) {
        pointsToDrawSmallerImage.add( evt.getPoint() );
        repaint();
    }
}
...

public void paintComponent(Graphics g) {
    g.clear();   // clear the canvas
    for( Point p : pointsToDrawSmallerImage ) {
       g.drawImage(img, p.x, p.y, myCanvas);           
    }
}
0 голосов
/ 25 октября 2011

это не так, как работает draw, метод draw рисует все, что есть в самом методе, на каждом перерисовке, это означает, что если вы вызываете метод для рисования чего-то один раз, он будет нарисован только для одного цикла перерисовки, и все.

Если вы хотите, чтобы что-то было нарисовано при нажатии, вы должны добавить это по щелчку в коллекцию и нарисовать всю коллекцию в каждом цикле рисования, чтобы оно оставалось навсегда.

...