Я пытаюсь создать небольшое приложение для рисования, в котором вы вводите нужный цвет и меняете размер кисти. Я сделал это, и это работает, но если я попытаюсь нарисовать быстро, приложение не будет обновляться в течение короткого периода времени, оставляя точки выглядящие так:
60 раз в секунду (потому что 60 раз в секунду должно быть достаточно, чтобы не оставлять точек / пробелов. См. Тиковый метод. В качестве теста я попытался установить ограничение no на ticksPerSecond, и я получил тот же вывод), если пользователь вызывает событие mouseDragged
или mousePressed
, я добавляю экземпляр класса Circle
(см. ниже)
class Circle {
int x, y;
int radius;
Color color;
Circle(int x, int y, int radius, Color color) {
this.x = x;
this.y = y;
this.radius = radius;
this.color = color;
}
}
Мой метод тиков: (Вызывается 60 раз в секунду)
private void tick() {
this.middle = this.brush.radius / 2; // Used because java.awt.Graphics will paint from your cursors xy, which will paint the circle down and to the right of the cursor
if (this.frame.isDragging) {
add(new Circle(this.frame.x - this.middle, this.frame.y - this.middle, this.brush.radius, this.brush.color));
}
}
Для рендеринга я просто пробегаю цикл foreach
, показанный ниже
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // Paint over everything else
try {
for (Circle circle : this.circles) {
g.setColor(circle.color);
g.fillOval(circle.x, circle.y, circle.radius, circle.radius);
}
} catch (ConcurrentModificationException ignore) {} //TODO MAKE THIS BETTER
}
Проигнорируйте, что я ловлю ConcurrentModifictionException
, это временное исправление, потому что я добавляю в список, который читается здесь. (Это заставляет краску мигать, пока я рисую, поэтому работает пока)
Меня спросили о моем фрейме, вот он (вам, вероятно, это не нужно, но я включил любой необходимый вам код. Я удаляю implement methods
, который не использовал):
class Frame extends JFrame implements MouseListener, MouseMotionListener {
int x, y;
boolean isDragging, isMouseOnScreen;
Frame(int width) {
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.getContentPane().setPreferredSize(new Dimension(width, width / 3 * 2));
this.setResizable(false);
this.pack();
this.setLocationRelativeTo(null);
BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
Cursor cursor = this.getToolkit().createCustomCursor(image, new Point(0, 0), "Cursor");
this.setCursor(cursor);
this.setFocusable(true);
this.requestFocus();
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.x = this.y = 0;
this.isDragging = this.isMouseOnScreen = false;
}
@Override
public void mouseDragged(MouseEvent e) {
this.x = e.getX() - 5;
this.y = e.getY() - 35;
}
@Override
public void mouseMoved(MouseEvent e) {
this.x = e.getX() - 5;
this.y = e.getY() - 35;
}
@Override
public void mousePressed(MouseEvent e) {
this.isDragging = true;
}
@Override
public void mouseReleased(MouseEvent e) {
this.isDragging = false;
}
@Override
public void mouseEntered(MouseEvent e) {
isMouseOnScreen = true;
}
@Override
public void mouseExited(MouseEvent e) {
isMouseOnScreen = false;
}
}