Java AWT Tela dei pesi massimi
Ho un'applet in cui sto disegnando cose sovrascrivendo il metodo paint() e ho aggiunto una Tela all'applet, che occuperà l'intero schermo. Questa tela sembra essere disegnata dopo il mio paint () ing, e quindi la roba paint()ed della mia applet è invisibile. Qualche idea su come forzare la tela da disegnare prima del mio metodo paint sulla mia applet?
Modifica:
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 answers
Anche se è necessario utilizzare AWT, si dovrebbe essere in grado di utilizzare un Panel
separato per il contenuto GL e lo stato della memoria:
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";
}
}
}
Senza vedere il tuo codice è difficile indovinare cosa hai fatto.
Il codice generale nel metodo paint()
dovrebbe probabilmente essere:
super.paint(g); // this will paint the children components added to the applet
// add your custom painting here
Inoltre, sarebbe meglio passare il tempo ad imparare Swing piuttosto che AWT dal momento che dipingere in Swing è un po ' diverso e potresti anche passare il tempo ad imparare una soluzione GUI più attuale.
Se hai bisogno di più aiuto pubblica il tuo SSCCE .
Se si intende dipingere qualcosa su quel componente canvas sovrascrivendo paint() del suo contenitore, non funzionerà. Il fatto è che i contenitori AWT non dipingono i loro figli. Questo è vero anche per i contenitori Swing a proposito. Se è necessario dipingere qualcosa sul componente canvas, definire la sottoclasse personalizzata del componente e inserire il codice di disegno nel suo metodo paint (). e quindi imposta quel componente nella tua applet tramite il metodo setGlassPane (). o, ancora meglio, semplicemente sovrascrivi paint () del tuo Canvas (non il suo contenitore) e fai il dipinto dopo aver invocato super.vernice(g)