1

ユーザーが背景色を設定できるようにするアプレットを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;
    }
}
4

1 に答える 1

1

あなたの絵は疑わしいように見えます:

  • あなたはpaint(...)直接電話をかけていますが、決してしてはいけないことです。
  • super.paint(...)ペイントオーバーライド内でメソッドを呼び出していません。
  • GUI を最小化してから元に戻してみてください。描画がどれだけ無に消えてしまうか教えてください。

代わりに、次のことを行う必要があります。

  • repaint()GUI を描画することを提案したいときに呼び出します
  • ペイント オーバーライドでスーパー メソッドを呼び出す
  • おそらくEllipse2Dなどの楕円のコレクションを作成し、forループを介してペイントメソッドでペイントします。
  • この AWT コードをすべてチャックし、代わりに JPanel のpaintComponent(...)メソッドで Swing を描画します。
  • 個々の楕円を描くのではなく、点を結ぶ線を描きます。ストロークを変えることで太さを変えることができます。
  • 描画された各曲線を BufferedImage に保存し、それを paintComponent メソッドで描画します。

編集:
完全な例については、ここで私の回答を参照してください: JPanel Graphics g color drawing line の変更

于 2013-11-05T03:49:52.520 に答える