Toile lourde Java AWT


J'ai une applet où je dessine des trucs en remplaçant la méthode paint (), et j'ai ajouté un Canevas à l'applet, qui occupera tout l'écran. Cette toile semble être dessinée après mon paint()ing, et donc le truc paint () ed de mon applet est invisible. Des idées sur la façon de forcer le canevas à être dessiné avant ma méthode de peinture sur mon applet?

Modifier:

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);
    }
}
Author: Tshepang, 2010-10-10

3 answers

Même si vous devez utiliser AWT, vous devriez pouvoir utiliser un Panel séparé pour le contenu GL et l'état de la mémoire:

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";
        }
    }
}
 1
Author: trashgod, 2010-10-10 17:45:42

Sans voir votre code, il est difficile de deviner ce que vous avez fait.

Le code général de la paint() méthode devrait probablement être:

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

En outre, il serait préférable de passer votre temps à apprendre Swing plutôt que AWT puisque la peinture dans Swing est quelque peu différente et vous pourriez aussi bien passer du temps à apprendre une solution GUI plus actuelle.

Si vous avez besoin de plus d'aide, postez votre SSCCE.

 1
Author: camickr, 2010-10-10 16:22:18

Si vous avez l'intention de peindre quelque chose sur ce composant canvas en remplaçant paint() de son conteneur, cela ne fonctionnera pas. Le fait est que les conteneurs AWT ne peignent pas leurs enfants. Cela est vrai même pour les conteneurs Swing en passant. Si vous avez besoin de peindre quelque chose sur le composant canvas, définissez votre sous-classe personnalisée de composant et placez votre code de dessin dans sa méthode paint (). et puis définissez ce composant dans votre applet via la méthode setGlassPane (). ou, mieux encore, remplacez simplement paint () de votre Toile (pas son conteneur) et faire la peinture après avoir invoqué super.peinture (g)

 1
Author: Andrew Butenko, 2010-10-10 16:30:17