【问题标题】:using paintComponent method in JApplet在 JApplet 中使用 paintComponent 方法
【发布时间】: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);
            }
        });
    }
}

【问题讨论】:

  • 我也尝试过使用重绘方法,但这会像轨迹一样不断地重写屏幕上的椭圆。
  • 您的原始程序中一定也有JFrameJApplet 应该替换 JFrame。您通过扩展 JPanel 创建的任何类都不必修改。如果这没有帮助,也许您可​​以提供更多代码。
  • 您可能必须覆盖 paint(Graphics g) 而不是 paintComponent(Graphics g)。不过不确定..确实检查是否没有JFrames 或其他窗口的东西,就像@Marco13 说的那样。
  • @Creator13 您应该覆盖paintComponent 方法,而不是paintpaintComponent 方法提供双缓冲,而 paint 方法不会。我实际上认为JComponents的paint方法调用了paintComponent方法。
  • 我看到你添加了代码,但这几乎是在 Jared 给出答案的同时。它基本上应该像他在您的案例中描述的那样简单:将不再需要 main 方法和 JFrame。相反,您创建一个扩展 JApplet 的新类并将您的 Main JPanel 添加为内容窗格。

标签: java swing applet awt paintcomponent


【解决方案1】:

不要修改您的JPanel,而是保留它并创建一个新类,您的JApplet 类:

public class YourJApplet extends JApplet{
    public void init(){
        final JPanel panel = new YourPanel();
        this.setContentPane(panel);
    }
}

就是这样——现在无论您的面板发生了什么,现在都是您的 JApplet。

【讨论】:

  • 我真的希望这能说明您应该通过JPanel 创建用户界面的观点(尽管我还没有在这里争论为什么您应该将JPanel 扩展到JComponent)。然后,如果您想要一个应用程序,您创建一个JFrame 并将其内容窗格设置为您的面板,或者,如果您想创建一个小程序,扩展JApplet 并将its 内容窗格设置为您的面板。
  • 是的,我现在明白这一点,我从来没有听说过 JFrame 和 JApplet 是在同一个 swing 类中继承的。我认为这是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多