#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. Я написал в своем вопросе изменить сцену . И вы можете прочитать следующую за ним строку.