Hallo allerseits,
in einem Demo-Programm (mit Netbeans erstellt und dem zugehörigen grafischen Editor) will ich zu Testzwecken immer wieder eine andere Ellipse in einen Offscreen schreiben und dann den ganzen Offscreen auf dem Bildschirm ausgeben.
Dazu erstelle ich das Attribut gesamtbild mit dem zugehörigen Grafikkontext gesamtGraphics (auch ein Attribut).
Die Ellipsen werden dann immer wieder in den gesamtGraphics Kontext geschrieben mit:
gesamtGraphics.drawOval(testi, testi, 30, 30);
Leider erscheinen sie nicht auf dem Bildschirm.
Wo ist mein Denkfehler ?
mfg
Ernst
[Java]
package packRandom2;
public class SpielJFrame extends javax.swing.JFrame {
SpielJPanel spielJPanel;
/** Creates new form SpielJFrame */
public SpielJFrame() {
initComponents();
spielJPanel = new SpielJPanel();
setSize(900, 700);
// An die Zeichenfläche muss das SpielJFrame montiert werden.
jPanel1.add(spielJPanel, "Center");
// --- Ende Einfügen ---
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setBackground(new java.awt.Color(153, 255, 153));
jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
jPanel1.setLayout(new java.awt.BorderLayout());
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(25, 25, 25)
.add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 450, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(25, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(22, 22, 22)
.add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 322, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(21, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SpielJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
[/Java]
[Java]
package packRandom2;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
public class SpielJPanel extends javax.swing.JPanel {
// --- Beginn Einfügen ---
private int flag = 0;
private Timer t;
//private Ball ball;
private Image gesamtBild;
private Graphics gesamtGraphics;
private int testi;
// --- Ende Einfügen ---
public SpielJPanel() {
initComponents();
// --- Beginn Einfügen ---
// ball = new Ball(this);
t = new Timer(2,
new ActionListener() {
public void actionPerformed(ActionEvent ae) {
allesUpdaten();
zeichneAllesOffscreen();
repaint();
}
});
t.start();
}
public void setTimer(int millis) {
t.setDelay(millis);
}
public int getTimerTime() {
return t.getDelay();
}
public void allesUpdaten() {
//ball.berechnePos();
}
// Alte Bildschirm wird nicht gelöscht
public void zeichneAllesOffscreen(){
int sx, sy;
sx = this.getSize().width;
sy = this.getSize().height;
//System.out.println("sx="+sx+"=sy="+sy);
if(sx!=0 && sy!=0){
if(flag==0){
// Dieser Teil wird genau einmal gemacht !!
flag=1;
System.out.println("flag="+flag);
// Erzeuge ein Bild
gesamtBild = createImage(sx, sy);
// Erzeuge den zum Grafikobjekt bild zugehörigen Grafikkontext,
// d.h. eine Leinwand, in die gemalt wird.
gesamtGraphics = gesamtBild.getGraphics();
System.out.println("sxx="+sx+" syy="+sy);
}
testi=testi+1;
System.out.println("testi="+testi);
gesamtGraphics.setColor(Color.red);
// Zeichne auf die Leinwand und damit in gesamtBild !
gesamtGraphics.drawOval(testi, testi, 30, 30);
//ball.zeichne(gesamtGraphics, Color.magenta);
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
//g.setColor(this.getBackground());
// Point pos;
// pos = ball.getPos();
// g.drawImage(ball.getImage(), pos.x, pos.y, this);
//g.drawImage(gesamtBild, pos.x, pos.y, this);
//g.drawImage(gesamtBild, pos.x, pos.y, this);
// Zeichne das gesamtBild auf die Ausgabe-Leinwand
g.drawImage(gesamtBild, 0, 0, this);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
setBackground(new java.awt.Color(255, 255, 255));
setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
setLayout(new java.awt.BorderLayout());
jPanel1.setBackground(new java.awt.Color(255, 255, 255));
jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
jPanel1.setLayout(new java.awt.BorderLayout());
add(jPanel1, java.awt.BorderLayout.CENTER);
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
[/Java]
in einem Demo-Programm (mit Netbeans erstellt und dem zugehörigen grafischen Editor) will ich zu Testzwecken immer wieder eine andere Ellipse in einen Offscreen schreiben und dann den ganzen Offscreen auf dem Bildschirm ausgeben.
Dazu erstelle ich das Attribut gesamtbild mit dem zugehörigen Grafikkontext gesamtGraphics (auch ein Attribut).
Die Ellipsen werden dann immer wieder in den gesamtGraphics Kontext geschrieben mit:
gesamtGraphics.drawOval(testi, testi, 30, 30);
Leider erscheinen sie nicht auf dem Bildschirm.
Wo ist mein Denkfehler ?
mfg
Ernst
[Java]
package packRandom2;
public class SpielJFrame extends javax.swing.JFrame {
SpielJPanel spielJPanel;
/** Creates new form SpielJFrame */
public SpielJFrame() {
initComponents();
spielJPanel = new SpielJPanel();
setSize(900, 700);
// An die Zeichenfläche muss das SpielJFrame montiert werden.
jPanel1.add(spielJPanel, "Center");
// --- Ende Einfügen ---
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setBackground(new java.awt.Color(153, 255, 153));
jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
jPanel1.setLayout(new java.awt.BorderLayout());
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(25, 25, 25)
.add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 450, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(25, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(22, 22, 22)
.add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 322, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(21, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SpielJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
[/Java]
[Java]
package packRandom2;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
public class SpielJPanel extends javax.swing.JPanel {
// --- Beginn Einfügen ---
private int flag = 0;
private Timer t;
//private Ball ball;
private Image gesamtBild;
private Graphics gesamtGraphics;
private int testi;
// --- Ende Einfügen ---
public SpielJPanel() {
initComponents();
// --- Beginn Einfügen ---
// ball = new Ball(this);
t = new Timer(2,
new ActionListener() {
public void actionPerformed(ActionEvent ae) {
allesUpdaten();
zeichneAllesOffscreen();
repaint();
}
});
t.start();
}
public void setTimer(int millis) {
t.setDelay(millis);
}
public int getTimerTime() {
return t.getDelay();
}
public void allesUpdaten() {
//ball.berechnePos();
}
// Alte Bildschirm wird nicht gelöscht
public void zeichneAllesOffscreen(){
int sx, sy;
sx = this.getSize().width;
sy = this.getSize().height;
//System.out.println("sx="+sx+"=sy="+sy);
if(sx!=0 && sy!=0){
if(flag==0){
// Dieser Teil wird genau einmal gemacht !!
flag=1;
System.out.println("flag="+flag);
// Erzeuge ein Bild
gesamtBild = createImage(sx, sy);
// Erzeuge den zum Grafikobjekt bild zugehörigen Grafikkontext,
// d.h. eine Leinwand, in die gemalt wird.
gesamtGraphics = gesamtBild.getGraphics();
System.out.println("sxx="+sx+" syy="+sy);
}
testi=testi+1;
System.out.println("testi="+testi);
gesamtGraphics.setColor(Color.red);
// Zeichne auf die Leinwand und damit in gesamtBild !
gesamtGraphics.drawOval(testi, testi, 30, 30);
//ball.zeichne(gesamtGraphics, Color.magenta);
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
//g.setColor(this.getBackground());
// Point pos;
// pos = ball.getPos();
// g.drawImage(ball.getImage(), pos.x, pos.y, this);
//g.drawImage(gesamtBild, pos.x, pos.y, this);
//g.drawImage(gesamtBild, pos.x, pos.y, this);
// Zeichne das gesamtBild auf die Ausgabe-Leinwand
g.drawImage(gesamtBild, 0, 0, this);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
setBackground(new java.awt.Color(255, 255, 255));
setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
setLayout(new java.awt.BorderLayout());
jPanel1.setBackground(new java.awt.Color(255, 255, 255));
jPanel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
jPanel1.setLayout(new java.awt.BorderLayout());
add(jPanel1, java.awt.BorderLayout.CENTER);
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
[/Java]