Java AWT Тяжелый холст - PullRequest
       17

Java AWT Тяжелый холст

2 голосов
/ 10 октября 2010

У меня есть апплет, в котором я рисую материал, переопределяя метод paint (), и добавил Canvas в апплет, который будет занимать весь экран. Кажется, этот холст рисуется после моего рисования (), и поэтому материал моего апплета paint () невидим. Любые идеи о том, как заставить рисовать холст перед моим методом рисования на моем апплете?

Edit:

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 ]

1 голос
/ 10 октября 2010

Если вы намереваетесь что-то закрасить поверх этого компонента canvas, переопределив paint () его контейнера, это не сработает. Дело в том, что контейнеры AWT не красят своих детей. Это верно даже для контейнеров Swing. Если вам нужно что-то нарисовать поверх компонента Canvas, определите свой собственный подкласс компонента и поместите код для рисования в его метод paint (). и затем установите этот компонент в ваш апплет с помощью метода setGlassPane (). или, что еще лучше, просто переопределите paint () вашего Canvas (не его контейнера) и сделайте рисование после вызова super.paint (g)

1 голос
/ 10 октября 2010

Даже если вы должны использовать 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";
        }
    }
}
1 голос
/ 10 октября 2010

Не видя ваш код, трудно угадать, что вы сделали.

Общий код в методе paint(), вероятно, должен быть:

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

Кроме того, было бы лучше потратить ваше время на изучение Swing, а не на AWT, поскольку рисование в Swing несколько отличаетсяи вы могли бы также потратить время на изучение более современного решения с графическим интерфейсом.

Если вам нужна дополнительная помощь, опубликуйте свой SSCCE .

...