рисование из внешнего метода

#java #applet #java-2d

#java #апплет #java-2d

Вопрос:

В моем апплете у меня есть метод paint , который рисует на экране.

 public void init() {
  addMouseMotionListener(new MouseMotionAdapter() {
        @Override
                public void mouseMoved(MouseEvent evt) {
                    storeCoordinates(evt,Graphics g); // results in error
                }
    });
}

public void paint(Graphics g) {
      // do something
}

public void storeCoordinates(MouseEvent evt , Graphics g) {
      // from this method i want to modify the scene painted by paint
}
 

Теперь в другом методе я хочу немного изменить сцену, которая была нарисована этим paint методом. Как я могу это сделать? Например, я хочу рисовать синие линии, используя g.drawLine(.,.,.,.) другой метод.

Приведенный выше фрагмент выдает сообщение об ошибке ) expected ; expected , cannot find symbol variable Graphics когда я вызываю функцию из mouseMoved

Комментарии:

1. мой вопрос: вы рисуете Graphics2D для апплета или яплета

2. @ mKorbel к яплету

3. Привет. Ошибка «) ожидается» вызвана тем, что в вашем коде вы пишете storeCoordinated(evt, —> Graphics <— g ); Так что это нарушенный синтаксис. Вам нужно будет получить графический контекст, который вы хотите нарисовать, и поместить его туда. Но я предлагаю вам придерживаться советов glowcoder.

4. Для более быстрой помощи опубликуйте SSCCE .

Ответ №1:

В ответ на изменения:

Итак, что я бы сделал в этом случае, так это не использовать графику прямо там. Вместо этого я бы сделал что-то вроде этого… Сохраняйте список своих точек, и когда вы нажмете, добавьте точку в свой список. Затем, когда вы рисуете, нарисуйте свои точки. (Если вы собираетесь рисовать только по щелчку мыши, вы можете просто сохранить последнюю точку, провести линию между текущей точкой и последней точкой и установить последнюю точку в текущую точку. Но это более расширяемый.)

 List<Point> points = new ArrayList<Points>();

public void init() {
  addMouseMotionListener(new MouseMotionAdapter() {
        @Override
                public void mouseMoved(MouseEvent evt) {
                    storeCoordinates(evt); // graphics removed
                }
    });
}

public void paint(Graphics g) {
    for(int i = 1; i < points.size(); i  ) {
        Point first = points.get(i - 1);
        Point second = points.get(i);
        g.setColor(Color.BLUE);
        g.drawLine(first.getX(), first.getY(), second.getX(), second.getY());
    }
}

public void storeCoordinates(MouseEvent evt) {
    int x = evt.getX();
    int y = evt.getY();
    points.add(new Point(x,y));
}
 

.

Старый ответ

Передайте свой графический объект в качестве параметра этому другому методу.

 public void paint(Graphics g) {
    externalPaint(g);
}

private void externalPaint(Graphics g) {
    g.drawLine(1,2,3,4);
}
 

Комментарии:

1. На самом деле я этого не спрашивал. Позвольте мне сделать мой вопрос более понятным

2. Проблема в том, что рисование (Graphics g) обрабатывается системным потоком. Вы не можете использовать Graphics g для рисования ad lib, это должно быть в методе рисования.

3. @Steve На самом деле, ты можешь. Вы можете передать этот графический объект любому желаемому методу. Делегирование вашего метода рисования работает довольно хорошо. Например, for(Person p : people) p.drawOn(g); и тогда каждый человек несет ответственность за рисование себя на графическом объекте. Ключ в том, что вы должны вызвать его ИЗ метода рисования, который будет выведен на экран.

4. @glowcoder вот что я имел в виду, системный поток должен запускать ваш код, что означает метод рисования.

5. @mKorbel Можете ли вы сослаться на URL JApplet.paintComponent(Graphics) -адрес метода? Кажется, я не могу найти его в своих JavaDocs для JApplet . 😉

Ответ №2:

Теперь в другом методе я хочу изменить сцену, которая была нарисована методом рисования. Как я могу это сделать?

Вызов Component.repaint(int,int,int,int) или JComponent.repaint(Rectangle) .

Комментарии:

1. Я не хочу снова рисовать весь экран. Просто немного измените его

2. @ Andrew Thompson ОП говорит, что хочет изменить сцену, которая ранее была нарисована методом рисования. Тогда почему он должен снова вызывать метод рисования, и это тоже в апплете. Это приведет к мерцанию. Обратите внимание, что событие будет запущено при перемещении мыши.

3. » немного измените это» , что должно быть выражено в вашем вопросе , учитывая, что мы не экстрасенсы. Смотрите мое редактирование.

4. @program-o-steve Вы хотите показать, как это делается в коде? Я замечаю, что вы не особенно хороши в «объединении точек», хотя, похоже, вы умеете голосовать за ответы на основе информации, которой не было , когда был сформулирован ответ!

5. Я написал в своем вопросе изменить сцену . И вы можете прочитать следующую за ним строку.