В настоящее время я делаю программу рисования, в которой мы рисуем квадраты, где они должны рисовать, когда пользователь перетаскивает мышь. Мой профессор научил нас этому в графическом режиме XOR
.
Я нашел этот код, и он выглядит намного эффективнее. Я смущен тем, как работает руководство, как оно написано для меня, когда они перетаскивают мышь. Это просто создаст кучу разных прямоугольников, и все они останутся на экране.
Как получается, что прямоугольник постоянно обновляется для мыши пользователя, но не остается на экране?
Это потому, что форма не добавляется к ArrayList
?
public DrawingBoard() {
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
// When the mouse is pressed get x & y position
drawStart = new Point(e.getX(), e.getY());
drawEnd = drawStart;
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
// Create a shape using the starting x & y
// and finishing x & y positions
Shape aShape = drawRectangle(drawStart.x, drawStart.y, e.getX(), e.getY());
// Add shapes, fills and colors to there ArrayLists
shapes.add(aShape);
shapeFill.add(fillColor);
shapeStroke.add(strokeColor);
drawStart = null;
drawEnd = null;
// repaint the drawing area
repaint();
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
// Get the final x & y position after the mouse is dragged
drawEnd = new Point(e.getX(), e.getY());
repaint();
}
});
}
public void paint(Graphics g) {
// Class used to define the shapes to be drawn
Graphics2D graphSettings = (Graphics2D) g;
// Antialiasing cleans up the jagged lines and defines rendering rules
graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// Defines the line width of the stroke
graphSettings.setStroke(new BasicStroke(2));
// Iterators created to cycle through strokes and fills
Iterator<Color> strokeCounter = shapeStroke.iterator();
Iterator<Color> fillCounter = shapeFill.iterator();
// Eliminates transparent setting below
graphSettings.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
for (Shape s : shapes) {
// Grabs the next stroke from the color arraylist
graphSettings.setPaint(strokeCounter.next());
graphSettings.draw(s);
// Grabs the next fill from the color arraylist
graphSettings.setPaint(fillCounter.next());
graphSettings.fill(s);
}
// Guide shape used for drawing
if (drawStart != null && drawEnd != null) {
// Makes the guide shape transparent
graphSettings.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.40f));
// Make guide shape gray for professional look
graphSettings.setPaint(Color.LIGHT_GRAY);
// Create a new rectangle using x & y coordinates
Shape aShape = drawRectangle(drawStart.x, drawStart.y, drawEnd.x, drawEnd.y);
graphSettings.draw(aShape);
}
}
repaint();
. Не уверен, что это более эффективно, чем XOR. - person Johnny Mopp   schedule 30.03.2018paintComponent
следует переопределить, а неpaint
, 2) в переопределении должен вызываться метод рисования супера - person Hovercraft Full Of Eels   schedule 30.03.2018I am confused as to how the guide works
- я тоже. Судя по предоставленному коду, это не должно работать, так как фон панели не очищается каждый раз, когда вызывается метод рисования, поэтому вы должны увидеть кучу разных прямоугольников. У вас должен отсутствовать код. В любом случае это не лучший пример для подражания. Я бы посоветовал вам ознакомиться с Подходы к рисованию на заказ он правильно рисует. Ключом являетсяsuper.paintComponent(...)
, который очищает фон до того, как все прямоугольники будут перекрашены. - person camickr   schedule 30.03.2018