Изменение цвета линии в программе рисования с использованием событий - PullRequest
3 голосов
/ 17 марта 2012
Я пытаюсь создать программу, которая рисует линию, используя точки. Я сделал это немного. Затем строка должна перерисовать себя, когда программа свернута и развернута снова. Это где моя первая проблема происходит. Скажем, я рисую 2 линии, последняя точка первой линии и первая точка моей второй линии объединяются, когда она максимизируется.

Это не моя главная проблема, однако. Я хочу реализовать обработчик клавиш, чтобы, например, при нажатии клавиш 1-9 каждая клавиша представляла собой разное изменение цвета для линии. Я пытался реализовать ключевой обработчик, но, очевидно, что-то идет не так, как я не могу заставить его работать. Любая помощь будет оценена. Мой код показан ниже.

</p> <pre><code>package part2; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.awt.Point; import java.awt.Color; public class ScribbleComponentRepaint extends JComponent implements Scribbler { int w = 640; int h = 360; Point c; ArrayList<Point> line; ArrayList<ArrayList<Point>> lines; public static void main(String[] args) { ScribbleComponentRepaint sc = new ScribbleComponentRepaint(); new JEasyFrame(sc, "Scribble"); sc.addMouseListener(new Clicker(sc)); sc.addMouseMotionListener(new Mover(sc)); sc.addKeyListener(new Keys(sc)); } public ScribbleComponentRepaint() { line = new ArrayList<Point>(); lines = new ArrayList<ArrayList<Point>>(); } public void handleKey(int e) { switch (e) { case KeyEvent.VK_1: break; default: { System.out.println("Default"); } } } public void paintComponent(Graphics g) { for (ArrayList<Point> line : lines) { int n = 0; int limit = 1; if (line.size() > 0) { for (Point p : line) { Point c = line.get(Math.max(n - limit, 0)); n++; g.setColor(Color.RED); g.drawLine(c.x, c.y, p.x, p.y); } } } } public void penDown(Point p) { c = p; } public void penUp(Point p) { drawTo(p); c = null; } public void drawTo(Point p) { if (c != null) { Graphics g = getGraphics(); g.setColor(Color.BLUE); g.drawLine(c.x, c.y, p.x, p.y); c = p; } line.add(c); lines.add(line); } public void drag(Point p) { //should not be null drawTo(p); } public Dimension getPreferredSize() { return new Dimension(w, h); } }

</p> <pre><code>package part2; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; public class Keys extends KeyAdapter { Scribbler sc; public Keys(Scribbler sc){ this.sc = sc; } public void keyPressed(KeyEvent e) { //System.out.println(k); sc.handleKey(e.getKeyCode()); } }

</p> <pre><code>package part2; import java.awt.*; public interface Scribbler { public void paintComponent(Graphics g); public void penDown(Point p); public void drag(Point p); public void penUp(Point p); public void handleKey(int e); }

Ответы [ 2 ]

3 голосов
/ 17 марта 2012

В конце основного:

    sc.setFocusable(true);
    sc.requestFocusInWindow();

КСТАТИ

  • GUI должен быть построен на EDT.
  • Попробуйте использовать привязки клавиш вместо KeyListener
  • Приятно разработанный код (как с определением интерфейса, так и с кодированием к нему), но для более быстрой помощи выложите SSCCE . Мне пришлось внести некоторые изменения в код, прежде чем я смог проверить свою теорию о том, что проблема с обнаружением ключей была «фокусом».
2 голосов
/ 17 марта 2012

Ну, вам просто нужно определить цветовую переменную. Эта переменная будет установлена ​​в ваших методах обработки ключей и использована в вашем методе рисования. Кроме того, вам нужно будет обновить экран после нажатия клавиши.

 public class ScribbleComponentRepaint extends JComponent implements Scribbler {
   Color color = Color.BLUE; // var definition
 ...
    public void handleKey(int e) {

    switch (e) {
        case KeyEvent.VK_1:
            color = Color.RED; // setting the new color
            break;
        default: {
            System.out.println("Default");
        }
    }
    repaint(); // updates the screen
}
...
public void paintComponent(Graphics g) {
    for (ArrayList<Point> line : lines) {
        int n = 0;
        int limit = 1;
        if (line.size() > 0) {
            for (Point p : line) {
                Point c = line.get(Math.max(n - limit, 0));
                n++;
                g.setColor(color); // uses the color var
                g.drawLine(c.x, c.y, p.x, p.y);
            }
        }
    }
}
...
...