Причина за забавяне при рисуване на набор от линии чрез плъзгане на мишката

Написах аплет на 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(...) вътре във вашата замяна на боя.
  • Опитайте да минимизирате GUI и след това да го възстановите, и ми кажете каква част от рисунката ви изчезва в нищото.

Вместо това трябва:

  • обадете се на repaint(), когато искате да предложите GUI да бъде боядисан
  • извикайте супер метода във вашата отмяна на картината
  • създайте колекция от овали, може би Ellipse2D, и ги нарисувайте по вашия метод на рисуване чрез for цикъл.
  • Изхвърлете целия този AWT код и вместо това рисувайте в Swing в метода paintComponent(...) на JPanel.
  • Вместо да рисувате отделни елипси, начертайте линии, свързващи точки. Можете да промените дебелината, като промените хода.
  • Запазете всяка изчертана крива върху 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