James Brown
James Brown

Reputation: 919

repaint() isn't called in Java program

I have a simple program (most of it is going to be used for something else) that just draws ovals when a user clicks the drawPanel JPanel and displays ovals. The problem is that the repaint() method isn't calling paintComponent(). Why is this?

Here is the code:

// Imports Used:
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
import java.awt.geom.*;
// Class DrawPolygon
public class DrawPolygon extends JPanel implements MouseListener
{
// Variables used in GUI
static JFrame frame;
static JPanel drawPanel;
static JPanel labelPanel;
static JPanel primaryPanel;
static JButton loadButton;
static JButton saveButton;
static JButton clearButton;
static JButton addButton;
static JButton moveButton;
static JButton exitButton;
// Variables used for GUI interaction
static final int SIZE = 6;
static int numVertices;
ArrayList<Point> vertices;
static Color outlineColor = Color.RED;
static int lineWidth = 10;
static Color fillColor = Color.BLACK;
// Constructor for new Polygon Drawing Application
public DrawPolygon()
{
    // Create Frame
    frame = new JFrame("Vector Painter");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Set Location of GUI on screen
    frame.setLocation(225,100);
    // Primary Panel to store Draw Panel and Lable/Button Panel
    primaryPanel = new JPanel();
    // Create Label Panel
    createLabelPanel();
    // Create Draw Panel
    createDrawPanel();
    // Add panels to Primary
    primaryPanel.add(labelPanel);
    primaryPanel.add(drawPanel);
    // Add to frame
    frame.getContentPane().add(primaryPanel);
    frame.pack();
    frame.setVisible(true);
}
// Add Buttons to left side
public void createLabelPanel()
{
    // Label Panel to add Buttons
    labelPanel = new JPanel();
    labelPanel.setBackground(Color.BLACK);
    labelPanel.setPreferredSize(new Dimension(200,600));
    // Create JButtons
    loadButton = new JButton("LOAD");
    loadButton.setPreferredSize(new Dimension(180,75));
    loadButton.setBackground(Color.BLACK);
    loadButton.setForeground(Color.WHITE);
    loadButton.addMouseListener(this);
    saveButton = new JButton("SAVE");
    saveButton.setPreferredSize(new Dimension(180,75));
    saveButton.setBackground(Color.BLACK);
    saveButton.setForeground(Color.WHITE);
    saveButton.addMouseListener(this);
    clearButton = new JButton("CLEAR");
    clearButton.setPreferredSize(new Dimension(180,75));
    clearButton.setBackground(Color.BLACK);
    clearButton.setForeground(Color.WHITE);
    clearButton.addMouseListener(this);
    addButton = new JButton("ADD");
    addButton.setPreferredSize(new Dimension(180,75));
    addButton.setBackground(Color.BLACK);
    addButton.setForeground(Color.WHITE);
    addButton.addMouseListener(this);
    moveButton = new JButton("MOVE");
    moveButton.setPreferredSize(new Dimension(180,75));
    moveButton.setBackground(Color.BLACK);
    moveButton.setForeground(Color.WHITE);
    moveButton.addMouseListener(this);
    exitButton = new JButton("EXIT");
    exitButton.setPreferredSize(new Dimension(180,75));
    exitButton.setBackground(Color.BLACK);
    exitButton.setForeground(Color.WHITE);
    exitButton.addMouseListener(this);
    // Add Buttons to Label Panel
    labelPanel.add(loadButton);
    labelPanel.add(saveButton);
    labelPanel.add(clearButton);
    labelPanel.add(addButton);
    labelPanel.add(moveButton);
    labelPanel.add(exitButton);
}
// Creates Draw Panel
public void createDrawPanel()
{
    // Draw Panel to Draw Polygons
    drawPanel = new JPanel();
    drawPanel.setBackground(Color.BLACK);
    drawPanel.setPreferredSize(new Dimension(600,600));
    drawPanel.addMouseListener(this);
    vertices = new ArrayList<>();
}

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);

    g.setColor(Color.ORANGE);

    for (Point spot : vertices)
    {
        g.fillOval(spot.x-SIZE, spot.y-SIZE, SIZE*2, SIZE*2);
    }

    g.drawString("Count: " + vertices.size(), 5, 15);

    System.out.println("repaint is working?");
}

// Execute when Load button is clicked
public void loadButton()
{
    System.out.println("Load Button CLICKED!!");
}
// Execute when Save button is clicked
public void saveButton()
{
    System.out.println("Save Button CLICKED!!");
}
// Execute when Clear button is clicked
public void clearButton()
{
    System.out.println("Clear Button CLICKED!!");
}
// Execute when Add button is clicked
public void addButton()
{
    System.out.println("Add Button CLICKED!!");
}
// Execute when Move button is clicked
public void moveButton()
{
    System.out.println("Move Button CLICKED!!");
}
public void mouseClicked(MouseEvent e)
{
    if (e.getSource() == loadButton)
    {
        loadButton();
    }
    else if (e.getSource() == saveButton)
    {
        saveButton();
    }
    else if (e.getSource() == clearButton)
    {
        clearButton();
    }
    else if (e.getSource() == addButton)
    {
        addButton();
    }
    else if (e.getSource() == moveButton)
    {
        moveButton();
    }
    else if (e.getSource() == exitButton)
    {
        System.exit(0);
    }
    else if (e.getSource() == drawPanel)
    {
        System.out.println("TEST");
        vertices.add(e.getPoint());
        repaint();
    }
}
// These are here because program wouldn't compile without them
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
// Main Function
public static void main(String[] args) 
{
    // Create Frame
    new DrawPolygon();        
}
}

Upvotes: 1

Views: 289

Answers (1)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

Actually repaint is being called, but on the current DrawPolygon object, but since you don't seem to be displaying one of these paintComponent(...) won't ever be called. To clarify, your current class, DrawPolygon, extends JPanel, but it doesn't seem to have been added to any container that is part of your GUI hierarchy. Perhaps you want to add your current object, your this, to the GUI somewhere? In fact you probably should consider using your current object in place of the your drawPanel JPanel object. I would consider just deleting that variable entirely.

Also unrelated to your problem, you almost never want to use MouseListeners on JButtons where ActionListeners should instead be used.

Upvotes: 4

Related Questions