ява холст шнурок - PullRequest
       2

ява холст шнурок

0 голосов
/ 10 августа 2011

Я хочу, чтобы строка была нарисована в произвольной позиции, затем перейти на новую позицию, но оставить свой отпечаток позади.

В java нет команды "stamp".

Как я могу это сделать?

Пока у меня есть только случайный символ, который прыгает, но не оставляет свою копию позади.

import java.awt.Canvas;
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JFrame;

@SuppressWarnings("serial")
public class test extends Canvas {

private static Random random = new Random();

public void paint(Graphics g) {
    g.drawString("X", random.nextInt(10) * 10, random.nextInt(10) * 10);

    try {
        Thread.sleep(250);
    } catch (Exception e ) {}

    repaint();
}

public static void main(String[] argS) {
    test canvas = new test();
    JFrame frame = new JFrame();
    frame.add(canvas);
    frame.setSize(300, 300);
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Ответы [ 3 ]

4 голосов
/ 10 августа 2011

Рекомендации:

  • Не смешивайте Swing с компонентами AWT - поэтому вместо объекта Canvas используйте JPanel.
  • Переопределите метод JPCelel paintComponent.
  • Вызовите метод super.paintComponent в качестве первой строки paintComponent.
  • Используйте Swing Timer для анимации и никогда не помещайте Thread.sleep в метод paint или paintComponent.На самом деле вам следует избегать использования Thread.sleep в любом месте графического интерфейса Swing, если вы не знаете, как обрабатывать параллелизм в Swing.
  • Никогда не вызывайте repaint () в методе paint или paintComponent.Вам повезло, что менеджер рисования достаточно умен, чтобы не позволить этому вызову привести к ошибке переполнения стека, вызванной рекурсией.
1 голос
/ 10 августа 2011

Просто сохраните в памяти все предыдущие позиции и распечатайте их тоже, возможно, в другом цвете.Вы также не говорите, хотите ли вы, чтобы символы печатались вечно или просто оставались видимыми в течение нескольких кадров.Если вы хотите, чтобы они исчезли через некоторое время, вы можете поместить свои случайные позиции в очередь и удалить элемент хвоста очереди (избавиться от более старых позиций, чтобы они не рисовались), пока вы рисуете новые кадры.

(Рекомендации от Ховеркрафта и Пауло тоже очень полезны.)

1 голос
/ 10 августа 2011

Когда вы используете repaint, система AWT вызовет метод canvas * update(), который очистит графику (нарисовав прямоугольник в цвете фона) и затем вызовет paint(). (Это для тяжелых компонентов AWT, таких как Canvas - для Swing это немного отличается.)

Итак, простой обходной путь будет дан путем переопределения update, чтобы не очистить компонент:

public void update(Graphics g) {
    this.paint(g);
}

Обратите внимание, что старые нарисованные строки все еще могут исчезнуть, когда система решит, что ваш компонент должен быть признан недействительным, например, после того, как другое окно покрыло это.

Не имеет отношения к этому:

Вы никогда не должны спать методом рисования (возможно, другим для отладки). Рисование будет выполнено в потоке отправки событий, и пока метод paint не завершен, никакие события не будут отправлены. Не делай этого.

Вместо этого, отдельный поток (или даже основной поток) выполняет цикл, который спит и вызывает repaint.

Также, как говорит Hovercraft, не смешивайте AWT с Swing. Используйте AWT Frame вместо JFrame Swing, если вы хотите использовать Canvas.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...