Причина задержки в рисовании линии, заданной перетаскиванием мыши

Я написал апплет на Java, который позволяет пользователю установить цвет фона и цвет «пера», затем щелкнуть и нарисовать в рамке окна, чтобы нарисовать линию. Я устанавливаю эту линию, заполняя овалы в каждой точке x и y перетаскивающей мышью. Я также позволяю пользователю использовать клавиши - и + для изменения размера линии, увеличивая или уменьшая радиус овалов. Моя проблема в том, что есть какая-то причина задержки в рисовании линии. Я считаю, что это в методе mouseDrag, и скорость, с которой выполняется этот метод, ограничивает количество точек x и y, которые можно получить для рисования овалов. Есть ли способ уменьшить это отставание, чтобы улучшить линии?

import java.applet.Applet;
import java.awt.Event;
import java.awt.Color;
import java.awt.Graphics;

public class Screen extends Applet
{
    int x = -20, y = -20;
    int height = 20, width = 20;
    boolean black, blue, cyan, green, magenta, orange, pink, red, white, yellow;

    public void init()
    {
    setSize(400,400);
    setBackground(Color.white);
    }
    public void paint(Graphics g)
    {
    if (black == true)
        g.setColor(Color.BLACK);
    else if (blue == true)
        g.setColor(Color.BLUE);
    else if (cyan == true)
        g.setColor(Color.CYAN);
    else if (green == true)
        g.setColor(Color.GREEN);
    else if (magenta == true)
        g.setColor(Color.MAGENTA);
    else if (orange == true)
        g.setColor(Color.ORANGE);
    else if (pink == true)
        g.setColor(Color.PINK);
    else if (red == true)
        g.setColor(Color.RED);
    else if (white == true)
        g.setColor(Color.WHITE);
    else if (yellow == true)
        g.setColor(Color.YELLOW);

    g.fillOval(x, y, width, height);
    }
    public boolean mouseDrag(Event e, int xPos, int yPos)
    {
    x = xPos;
    y = yPos;
    paint(getGraphics());
    return true;
    }
    public boolean keyDown(Event e, int key)
    {
    black = false;
    blue = false;
    cyan = false;
    green = false;
    magenta = false;
    orange = false;
    pink = false;
    red = false;
    white = false;
    yellow = false;

    if (key == 'n')
    {
        x =-20;
        y =-20;
        update(getGraphics());
    }
    else if (key == 'x')
        black = true;
    else if (key == 'b')
        blue = true; 
    else if (key == 'c')
        cyan = true;
    else if (key == 'g')
        green = true;
    else if (key == 'm')
        magenta = true;
    else if (key == 'o')
        orange = true;
    else if (key == 'p')
        pink = true;
    else if (key == 'r')
        red = true;
    else if (key == 'w')
        white = true;
    else if (key == 'y')
        yellow = true;
    else if (key == '+')
    {
        height += 5;
        width += 5;
    }
    else if (key == '-')
    {
        height += -5;
        width += -5;
    }
    else if (key == 'X')
        setBackground(Color.BLACK);
    else if (key == 'B' )
        setBackground(Color.BLUE); 
    else if (key == 'C')
        setBackground(Color.CYAN);
    else if (key == 'G')
        setBackground(Color.GREEN);
    else if (key == 'M')
        setBackground(Color.MAGENTA);
    else if (key == 'O')
        setBackground(Color.ORANGE);
    else if (key == 'P')
        setBackground(Color.PINK);
    else if (key == 'R')
        setBackground(Color.RED);
    else if (key == 'W')
        setBackground(Color.WHITE);
    else if (key == 'Y')
        setBackground(Color.YELLOW);
    return true;
    }
}

person DirtyWhite    schedule 05.11.2013    source источник


Ответы (1)


Ваша картина выглядит сомнительно:

  • Вы звоните paint(...) напрямую, чего никогда не следует делать.
  • Вы не вызываете метод super.paint(...) внутри вашего переопределения краски.
  • Попробуйте свернуть свой графический интерфейс, а затем восстановить его, и скажите мне, какая часть вашего рисунка исчезает в небытии.

Вместо этого вы должны:

  • вызовите repaint(), когда вы хотите предложить отрисовать графический интерфейс
  • вызовите метод super в вашем переопределении картины
  • создайте набор овалов, возможно, Ellipse2D, и нарисуйте их в своем методе рисования с помощью цикла for.
  • Отбросьте весь этот код AWT и вместо этого рисуйте в Swing в методе paintComponent(...) JPanel.
  • Вместо того, чтобы рисовать отдельные эллипсы, рисуйте линии, соединяющие точки. Вы можете изменить толщину, изменив Stroke.
  • Сохраняйте каждую кривую, нарисованную в BufferedImage, которая затем рисуется в методе paintComponent.

Изменить:
Полный пример см. в моем ответе здесь: Изменение линии рисования цвета JPanel Graphics g

person Hovercraft Full Of Eels    schedule 05.11.2013
comment
если бы мне нужно было рисовать линии, соединяющие точки, как бы я их раскрасил, чтобы на самом деле рисовать кривые? - person DirtyWhite; 05.11.2013
comment
@DirtyWhite: ваши точки будут довольно близко друг к другу, поэтому нарисованное изображение будет изгибаться, если пользователь рисует кривые. Он будет похож на тот, что у вас есть сейчас, только подключен и, следовательно, лучше. - person Hovercraft Full Of Eels; 05.11.2013
comment
О боже. Это в миллион раз лучше. Я только что создал новые переменные xO и yO и зациклил на них старые значения x и y, чтобы нарисовать соединенную линию. Большое спасибо. - person DirtyWhite; 05.11.2013
comment
@DirtyWhite: Вероятно, вы все еще делаете некоторые из тех же ошибок. Вы уже свернули свое приложение и восстановили его? Что происходит с вашим имиджем? - person Hovercraft Full Of Eels; 05.11.2013
comment
Он перекрашивается и, таким образом, обновляется и, таким образом... удаляется. Я знаю об этом и буду продолжать реализовывать другие ваши предложения. Я просто очень рад, что линия стала намного более связанной. Однако я не могу найти способ изменить штрих линии. Это в классе Графика? или это полностью вне AWT? - person DirtyWhite; 05.11.2013
comment
@DirtyWhite: это в Graphics2D: setStroke(...). Я обычно использую для этого объект BasicStroke. - person Hovercraft Full Of Eels; 05.11.2013
comment
@DirtyWhite: см. ссылку на мой код в редактировании моего ответа или проверьте эту ссылку. - person Hovercraft Full Of Eels; 05.11.2013