ABC
ABC

Reputation: 655

How to prevent flushing when draw a rectangle in Java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;  
import java.util.List;
import java.util.ArrayList;

class DrawningBoard extends Canvas implements MouseMotionListener{
      private List<Point> points = new ArrayList<>();
      private List<List<Point>> curves = new ArrayList<>();
      private boolean isRectangle = false;
      private int xr, yr, widthr, heightr;

public void setIsRectangle(boolean trueOrFalse){
    isRectangle = trueOrFalse;
}
public boolean getIsRectangle(){
    return isRectangle;
}

public DrawningBoard(){
    setBackground(Color.MAGENTA);
    addMouseMotionListener(this); 
    addMouseListener(new MouseAdapter(){
        public void mouseReleased(MouseEvent e){
            curves.add(points);
            points = new ArrayList<>();
        }
        public void mousePressed(MouseEvent e){
            points.add(new Point(e.getX(), e.getY()));
        }
    });
}

public void paint(Graphics g){
    g.setColor(Color.CYAN);
    if(isRectangle){
        g.drawRect(xr, yr, widthr, heightr);
    }
    for(List<Point> curve : curves){
        for(int i = 0; i < curve.size() - 1; i++){
            g.drawLine((int)curve.get(i).getX(), (int)curve.get(i).getY(), (int)curve.get(i + 1).getX(), (int)curve.get(i + 1).getY());
        }
    }
}

public void mouseDragged(MouseEvent e){  
    Graphics g = getGraphics();
    g.setColor(Color.CYAN);
    
    int xx = e.getX();
    int yy = e.getY();
    
    int x = (int)points.get(points.size() - 1).getX();
    int y = (int)points.get(points.size() - 1).getY();
    int dx = xx-x;
    int dy = yy-y;

    if(isRectangle){
        if(dx >= 0 && dy >= 0){
            xr = x;
            yr = y;
            widthr = dx;
            heightr = dy;
        } else if(dx < 0 && dy < 0){
            xr = xx;
            yr = yy;
            widthr = -dx;
            heightr = -dy;
        } else if(dx >= 0 && dy < 0){
            xr = x;
            yr = yy;
            widthr = dx;
            heightr = -dy;
        } else if(dx < 0 && dy >= 0){
            xr = xx;
            yr = y;
            widthr = -dx;
            heightr = dy;
        }
        repaint();
    } 
    else {
        g.drawLine(xx, yy, (int)points.get(points.size() - 1).getX(), (int)points.get(points.size() - 1).getY());
        points.add(new Point(xx, yy));
    }
    
}

public void mouseMoved(MouseEvent e) { }  
}

class GUI extends JFrame implements ActionListener{
private JPanel[] panel;
private JButton[] button;
private DrawningBoard board;

public GUI(String title){
    super(title);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    setSize(416, 400);
    
    board = new DrawningBoard();
    board.setBounds(0,0, 400, 400);
    
    panel = new JPanel[3];
    panel[0] = new JPanel();
    panel[1] = new JPanel();
    panel[2] = new JPanel();
    panel[0].setLayout(null);
    panel[1].setLayout(null);
    panel[2].setLayout(null);
    panel[0].setBounds(0, 0, 400, 20);
    panel[1].setBounds(0, 20, 400, 400);
    panel[2].add(panel[0]);
    panel[2].add(panel[1]);
    panel[0].setBackground(Color.red);
    
    button = new JButton[5];
    button[0] = new JButton("Rectangle");
    button[1] = new JButton("b1");
    button[2] = new JButton("b2");
    button[3] = new JButton("b3");
    button[4] = new JButton("b4");
    button[0].addActionListener(this);
    button[3].addActionListener(this);

    button[0].setBounds(0, 0, 100, 20);
    button[1].setBounds(100, 0, 100, 20);
    button[2].setBounds(200, 0, 100, 20);
    button[3].setBounds(300, 0, 100, 20);
    button[4].setBounds(0, 0, 100, 20);
    
    panel[0].add(button[0]);
    panel[0].add(button[1]);
    panel[0].add(button[2]);
    panel[0].add(button[3]);
    panel[0].add(button[4]);
    
    panel[1].add(board);

    add(panel[2]);  
    
    show();
}
public void actionPerformed(ActionEvent e){
    String command = e.getActionCommand();
    if(command.equals("Rectangle")) 
        board.setIsRectangle(!board.getIsRectangle());
}
}


public class Paint{
public static void main(String []str){
    new GUI("Paint");
}
}

I want to create a Paint application. If I draw multiple curves on the board and then I want to draw a
rectangle (using drawRect(x, y, width, height)), those curves are repainted and results some flushing as result of use repaint() method. How can I avoid that flushing?
I tried to use update() method, but many rectangles are drawn when mouse dragging.

Upvotes: 0

Views: 52

Answers (1)

camickr
camickr

Reputation: 324118

Swing is double buffered by default.

public void paint(Graphics g){

Don't override paint(). You have done this incorrectly and have lost the benefit of double buffering.

Instead, custom painting should be done by overriding the paintComponent(...) method. Read the section from the Swing tutorial on Custom Painting for more information and working examples.

You can also check out the DrawOnComponent example from Custom Painting Approaches for a more complete example that does what you want.

Upvotes: 1

Related Questions