user1272201
user1272201

Reputation: 21

Painting Components on Nested JPanels (Java)

Anyone have any idea how i can paint a circle on a JPanel within a JPanel?

Basically i have JPanel within another and i've created a new Circle class which extends JComponent. I've then added that to one of the panels and tried repainting but nothing is showing. Any ideas? Heres my code:

      class Circle extends JComponent 
{       
    @Override     public void paintComponent(Graphics g)
{
        super.paintComponent(g);
        g.drawOval(10,10, 11, 11);
        g.setColor(Color.RED);
        g.fillOval(10,10, 11, 11);                  
  } 
}


public void drawTest()
{
    Circle circle = new Circle();
    circle.setOpaque(false);
    circle.setSize(22, 22);
    circle.setVisible(true);
    circle.setBounds(11,11,11,5);
    jpanel.add(circle); 
    jpanel.repaint();

}

The code works when i add the circle to the main panel[ add(circle) ] but refuses for any sub panels.

Upvotes: 2

Views: 1176

Answers (2)

nIcE cOw
nIcE cOw

Reputation: 24626

You need to override getPreferredSize(...) method as you are doing it with paintComponent(...) method, let it be something like :

public Dimension getPreferredSize()
{
    return (new Dimension(300, 300));
}

Here is one sample program for your further help :

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TwoButtons
{
    private int x;
    private int y;
    private int count = 0;

    private Timer timer;

    private ActionListener actionTimer; 

    public static void main(String args[])
    {
        Runnable runnable = new Runnable()
        {
            public void run()
            {
                TwoButtons gui = new TwoButtons();
                gui.go();
            }
        };      
        SwingUtilities.invokeLater(runnable);
    }

    public void go()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();

        /*
         * Class Name : 
         * Java Naming Convention says that class names 
         * should be in Pascal Case, i.e. the first
         * letter of the class name should be capitalized
         * and every new word must start with a capitalized 
         * Alphabet.
         * For Example : 
         * public class ClassName{...}
         * ----------------------------------------------------------
         * Variable Name : 
         * Java Naming Convention says that the variable name
         * should be in Camel Case, i.e. the first letter of 
         * the variable name should be small case or _ (underscore)
         * and every new word must start with a capitalized
         * Alphabet.
         * ---------------------------------------------------------
         */
        final MyDraw drawPanel = new MyDraw(70, 70);
        x = drawPanel.getXValue();
        y = drawPanel.getYValue();
        contentPane.add(drawPanel);

        actionTimer = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {               
                x++;
                y++;
                if (count < 100)
                    drawPanel.setXYValues(x, y, count);
                else if (count == 100)
                    timer.stop();
                count++;
            }
        };

        frame.getContentPane().add(contentPane);
        frame.setSize(300,300);
        frame.setVisible(true);        

        timer = new Timer(40, actionTimer);
        timer.start();
    }
    class MyDraw extends JComponent
    {
        private int x;
        private int y;
        private int count = 0;
        private Timer timer;

        public MyDraw(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public int getXValue()
        {
            return x;
        }

        public int getYValue()
        {
            return y;
        }

        public void setXYValues(int x, int y, int count)
        {
            this.x = x;
            this.y = y;
            this.count = count;
            repaint();
        }

        public Dimension getPreferredSize()
        {
            return (new Dimension(300, 300));
        }

        public void paintComponent(Graphics g)
        {
            g.setColor(Color.green);
            g.fillOval(x, y, 40, 40);
        }
    }
}

Upvotes: 2

Gilbert Le Blanc
Gilbert Le Blanc

Reputation: 51565

You have to write quite a few methods when extending JComponent.

If you extend JPanel, and override the paintComponent method, you'll have better luck getting your Circle class to play nicely with the other Swing Components.

Upvotes: 1

Related Questions