【发布时间】:2014-05-23 05:32:48
【问题描述】:
我在 Java 中创建了一个允许拖动两个椭圆形的程序。现在我想把它转换成JApplet,所以我让这个类扩展JApplet,而不是原来的JPanel。这样做的问题是 super.paintComponent(g) 不起作用,因为它不再是父类。
我尝试在类中创建一个JPanel,然后引用这个,但我收到错误:JComponent 类型中的方法paintComponent(Graphics) 不可见
任何关于我需要做什么的提示或任何帮助将不胜感激。
这是我的代码。
public class Main extends JPanel
{
private static final String TITLE = "Drag me!";
private static final int W = 640;
private static final int H = 480;
private Point origin = new Point(W / 2, H / 2);
private Point mousePt;
public Main() {
this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
this.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
mousePt = e.getPoint();
repaint();
}
});
this.addMouseMotionListener(new MouseMotionAdapter()
{
@Override
public void mouseDragged(MouseEvent e)
{
int dx = e.getX() - mousePt.x;
int dy = e.getY() - mousePt.y;
origin.setLocation(origin.x + dx, origin.y + dy);
mousePt = e.getPoint();
repaint();
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(W, H);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(0, origin.y, getWidth(), origin.y);
g.drawOval(origin.x, 0, origin.x, getHeight());
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame(TITLE);
f.add(new Main());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}
【问题讨论】:
-
我也尝试过使用重绘方法,但这会像轨迹一样不断地重写屏幕上的椭圆。
-
您的原始程序中一定也有
JFrame。JApplet应该替换JFrame。您通过扩展JPanel创建的任何类都不必修改。如果这没有帮助,也许您可以提供更多代码。 -
您可能必须覆盖
paint(Graphics g)而不是paintComponent(Graphics g)。不过不确定..确实检查是否没有JFrames或其他窗口的东西,就像@Marco13 说的那样。 -
@Creator13 您应该覆盖
paintComponent方法,而不是paint。paintComponent方法提供双缓冲,而paint方法不会。我实际上认为JComponents的paint方法调用了paintComponent方法。 -
我看到你添加了代码,但这几乎是在 Jared 给出答案的同时。它基本上应该像他在您的案例中描述的那样简单:将不再需要
main方法和JFrame。相反,您创建一个扩展JApplet的新类并将您的MainJPanel 添加为内容窗格。
标签: java swing applet awt paintcomponent