Reputation: 21
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
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
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