javascreenpaintjava-canvas

Java clears screen when calling paint method - how to avoid that?


I'm trying to draw two lines in a Canvas in Java, calling two methods separately, but when I draw the second line, the first one disapears (Java clears the screen). How can I avoid that? I want to see the two lines. I've seen paint tutorials (how to make a program like the Paint on Windows) where the user uses the mouse to draw lines and when one line is drawn, the other do not disappear. They just call the paint method and it does not clear the screen.

I'll be grateful if anyone can help me. Thanks.

View Class

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class CircuitTracePlotView extends JFrame {


    private CircuitTracePlot circuitTracePlot;

    public  CircuitTracePlotView() {


        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.getContentPane().add(circuitTracePlot = new CircuitTracePlot(), BorderLayout.CENTER);
        this.pack();
        this.setSize(250,250);
        this.setLocationRelativeTo(null);

        this.setVisible(true);
        circuitTracePlot.drawLine();
        circuitTracePlot.drawOval();
    }


}

class CircuitTracePlot extends Canvas {

    private final static short LINE = 1;
    private final static short OVAL = 2;
    private int paintType;

    private int x1;
    private int y1;
    private int x2;
    private int y2;

    public CircuitTracePlot() {
        this.setSize(250,250);
        this.setBackground(Color.WHITE);

    }

    private void setPaintType(int paintType) {
        this.paintType = paintType;
    }

    private int getPaintType() {
        return this.paintType;
    }

    public void drawLine() {
        this.setPaintType(LINE);
        this.paint(this.getGraphics());
    }

    public void drawOval() {
        this.setPaintType(OVAL);
        this.paint(this.getGraphics());
    }

    public void repaint() {
        this.update(this.getGraphics());
    }

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

    public void paint(Graphics g) {
        switch (paintType) {
        case LINE:
            this.getGraphics().drawLine(10, 10, 30, 30);            
        case OVAL:
            this.getGraphics().drawLine(10, 20, 30, 30);
        }


    }


}

Main class

import javax.swing.SwingUtilities;

import view.CircuitTracePlotView;

public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                CircuitTracePlotView cr = new CircuitTracePlotView();
            }
        });
    }
}

Solution

  • Edit

    Since Trash posted his code,...

    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.*;
    
    public class CircuitTracePlot2 extends JPanel {
    
       private static final int PREF_W = 250;
       private static final int PREF_H = PREF_W;
    
       private int drawWidth = 160;
       private int drawHeight = drawWidth;
       private int drawX = 10;
       private int drawY = 10;
       private PaintType paintType = PaintType.LINE;
    
       public CircuitTracePlot2() {
    
       }
    
       @Override
       public Dimension getPreferredSize() {
          return new Dimension(PREF_W, PREF_H);
       }
    
       public void setPaintType(PaintType paintType) {
          this.paintType = paintType;
          repaint();
       }
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          if (paintType == null) {
             return;
          }
          switch (paintType) {
          case LINE:
             g.drawLine(drawX, drawY, drawWidth, drawHeight);
             break;
          case OVAL:
             g.drawOval(drawX, drawY, drawWidth, drawHeight);
             break;
          case SQUARE:
             g.drawRect(drawX, drawY, drawWidth, drawHeight);
    
          default:
             break;
          }
       }
    
       private static void createAndShowGui() {
          final CircuitTracePlot2 circuitTracePlot = new CircuitTracePlot2();
    
          JFrame frame = new JFrame("CircuitTracePlot2");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(circuitTracePlot);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
    
          int timerDelay = 2 * 1000;
          new Timer(timerDelay , new ActionListener() {
             private int paintTypeIndex = 0;
    
             @Override
             public void actionPerformed(ActionEvent arg0) {
                paintTypeIndex++;
                paintTypeIndex %= PaintType.values().length;
                circuitTracePlot.setPaintType(PaintType.values()[paintTypeIndex]);
             }
          }).start();
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    
    enum PaintType {
       LINE, OVAL, SQUARE;
    }