Java AWT重量级画布

时间:2010-10-10 15:53:02

标签: java canvas awt paint

我有一个小程序,我通过覆盖paint()方法来绘制东西,并在小程序中添加了一个Canvas,它将占据整个屏幕。这个画布似乎是在我的paint()之后绘制的,所以我的applet的paint()ed东西是不可见的。关于如何在我的applet上绘制paint方法之前强制绘制画布的任何想法?

编辑:

public void paint(Graphics g) {
    super.paint(g);
    if (DEBUG) {
        g.setColor(Color.red);
        g.drawString("Memory free: " + ((Runtime.getRuntime().freeMemory()
            / 1024) / 1024) + "MB", 5, 20);
        g.drawString("Memory total: " + ((Runtime.getRuntime().totalMemory()
            / 1024) / 1024) + "MB", 5, 35);
        g.drawString("Memory used: " + (((Runtime.getRuntime().totalMemory()
            - Runtime.getRuntime().freeMemory()) / 1024) / 1024) + "MB", 5, 50);
    }
}

3 个答案:

答案 0 :(得分:1)

如果没有看到你的代码,就很难猜到你做了什么。

paint()方法中的一般代码应该是:

super.paint(g); // this will paint the children components added to the applet
// add your custom painting here

此外,最好花时间学习Swing而不是AWT,因为Swing中的绘画有些不同,你也可以花时间学习更新的GUI解决方案。

如果您需要更多帮助,请发布SSCCE

答案 1 :(得分:1)

如果您打算通过覆盖其容器的paint()来绘制该画布组件上的某些内容,则它将无法工作。问题是,AWT容器不会给孩子涂漆。顺便说一下,即使对于Swing容器也是如此。如果需要在canvas Component上绘制一些东西,请定义组件的自定义子类,并将绘图代码放在paint()方法中。然后通过setGlassPane()方法将该组件设置到您的applet中。或者更好的是,简单地覆盖Canvas(而不是它的容器)的paint()并在调用super.paint(g)之后进行绘制

答案 2 :(得分:1)

即使您必须使用AWT,您也应该能够使用单独的Panel作为GL内容和内存状态:

import java.awt.*;
import java.awt.event.*;

public class AWTPaintTest {

    public static void main(String[] args) {
        Frame frame = new Frame();
        // frame.add(new AWTGLCanvas(), BorderLayout.CENTER);
        frame.add(new MemoryPanel(), BorderLayout.SOUTH);
        frame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.pack();
        frame.setVisible(true);
    }

    private static class MemoryPanel extends Panel {

        private final Runtime r = Runtime.getRuntime();

        public MemoryPanel() {
            this.setPreferredSize(new Dimension(240, 120));
            this.setForeground(Color.blue);
            this.setFont(new Font("Monospaced", Font.BOLD, 16));
            this.addMouseListener(new MouseAdapter() {

                @Override
                public void mousePressed(MouseEvent e) {
                    r.gc();
                    MemoryPanel.this.repaint();
                }
            });
        }

        @Override
        public void paint(Graphics g) {
            super.paint(g);
            long m = r.maxMemory();
            long t = r.totalMemory();
            long f = r.freeMemory();
            int y = g.getFontMetrics().getHeight() + 4;
            g.drawString("Memory max:   " + toMB(m), 5, 1 * y);
            g.drawString("Memory total: " + toMB(t), 5, 2 * y);
            g.drawString("Memory free:  " + toMB(f), 5, 3 * y);
            g.drawString("Memory used:  " + toMB(t - f), 5, 4 * y);
            g.drawString("Click to update.", 5, 5 * y);
        }

        private String toMB(long bytes) {
            return (bytes / 1024) / 1024 + " MB";
        }
    }
}