任何人都知道如何在JPanel中的JPanel上画一个圆圈?
基本上我在另一个中有JPanel,我创建了一个扩展JComponent的新Circle类。然后我将其添加到其中一个面板并尝试重新绘制,但没有任何显示。有任何想法吗?继承我的代码:
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();
}
当我将圆圈添加到主面板[add(circle)]但拒绝任何子面板时,代码有效。
答案 0 :(得分:1)
在扩展JComponent
时,您必须编写很多方法。
如果您延长JPanel
并覆盖paintComponent
方法,那么您可以更好地让Circle
课程与其他Swing组件完美匹配。
答案 1 :(得分:1)
您需要覆盖getPreferredSize(...)方法,因为您使用paintComponent(...)
方法进行操作,请将其设为:
public Dimension getPreferredSize()
{
return (new Dimension(300, 300));
}
以下是一个示例程序,供您进一步寻求帮助:
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);
}
}
}