Swing-Applet: Panelinhalt ändern

  • Themenstarter Themenstarter ronbigb
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
R

ronbigb

Gast
Hallo!

Ich sitze arg in der Klemme und wäre für jeden Hint sehr dankbar. Also: Vielen Dank schon mal im voraus für Eure Bemühungen.

Es geht um folgendes: Ich arbeite an einem Applet, welches EKGs darstellt. Diese bzw. die einzelnen Zeiten können dann vermessen werden. Das funktioniert auch einwandfrei:

Code:
public class Test05 extends JApplet {
...
public Component createComponents() {
...
        ImageIcon image = new ImageIcon("ekg.jpg");
        Measurement measurement = new Measurement(image, this);
        pane.add(measurement);
        return pane;
}
private void createGUI() {	  				
        getContentPane().add(createComponents());                     
}	
public void init() {						
    	try {...  createGUI(); 	}
    	catch (Exception e) { ... }
}  

public class Measurement extends JLabel { 
...
Test05 controller;
public Measurement(ImageIcon image, Test05 controller) {
         super(image);
         this.controller = controller;     
...
}
// An dieser Stelle kommt eine MouseListener-Subklasse, die auf die Mauseingabe zur Vermessung reagiert
protected void paintComponent(Graphics g) {
         super.paintComponent(g); 
         // Hier folgen alle drawLine-Anweisungen, um die "Messlate" zu zeichnen
         g.drawLine(x1,y,x2,y);
         ...
}
}
Ich hoffe, das war einigermassen verständlich (geht ja nur um's Prinzip). Aber - wie gesagt - das funktioniert im Prinzip alles einwandfrei.

Das Problem kommt jetzt: Nun soll der User zusätzlich in das EKG zoomen können und in diesem Teil soll natürlich wieder vermessen werden. Dazu müsste ich aber das dargestellte ImageIcon ändern können und das krieg ich schlichtweg nicht hin. Auch wenn ich Anweisungen wie pane.remove(measurement); einfüge, um danach z.B. eine zweite Instanz von Measurement mit anderem image zu erstellen und diese wieder einzufügen mit add(), klappt das einfach nicht.

Auch funktioniert pane.removeAll() und ähnliches nicht, irgendwie liegt der Hund wohl in paintComponent begraben (?).

Initial habe ich versucht, irgendwie die image-Variable "dynamisch" zu halten, aber soviel ich unterdessen begriffen habe, kann ich den Inhalt einer Variable, die ich an die Subklasse weitergebe ja danach nicht einfach wieder ändern.

Ihr werdet es bemerkt haben: Mein Wissen reicht nicht aus und die Suche im Netz hat sich als extrem frustran herausgestellt. Ich bitte Euch daher um jeden Hinweis, der eventuell weiterhilft. Merci!
 
Auch wenn ich Anweisungen wie pane.remove(measurement); einfüge, um danach z.B. eine zweite Instanz von Measurement mit anderem image zu erstellen und diese wieder einzufügen mit add(), klappt das einfach nicht.
Was klappt da nicht? Wird das Bild nicht angezeigt?
Um neu eingefügte Komponenten zur Laufzeit zu zeichnen, musst du ein Neuzeichnen anfordern, im Prinzip also die Oberfläche "bereinigen".
Nach dem Hinzufügen von Komponenten sollte also noch
Code:
validate();
an dem Container aufgerufen werden, dem die Component's hinzugefügt wurden.
 
Hi! Und vielen Dank für den Input.

Vielleicht stell ich mich auch einfach doof an (was ich nicht hoffe 😉. Gut, validate() habe ich versucht, hat nicht geklappt. Ich hab nun wieder ca. 2h gelesen und geforscht, finde aber den Fehler nicht.

Ich habe hier mal ein im Prinzip analoges Beispiel als Kurzfassung. Es wird mir schliesslich immer nur das letzte mit add() hinzugefügte Panel dargestellt. Das erste Panel mit der ersten Grafik erscheint schlicht nie!

Code:
public class Basics01 extends JApplet {
  public void init() {

    Image image1 = getImage( getCodeBase(), "ekg.jpg" );
    Image image2 = getImage( getCodeBase(), "ekg2.jpg" );

    MyPanel panel1 = new MyPanel(image1);
    MyPanel panel2 = new MyPanel(image2);
    getContentPane().add(panel1);   
    int summe =0;
    for (int i= 0; i <= 200000000; i++)
    {      
    	summe++;
    }
    getContentPane().remove(panel1);    
    getContentPane().add(panel2);
    getContentPane().validate();
  }
}

class MyPanel extends JPanel{
  Image img;

  MyPanel(Image img){
    this.img = img;
  }

  public void paintComponent( Graphics g ) {
    super.paintComponent(g);
    g.drawImage( img, 0, 0, this );
  }
}
Ich hoffe, meine "Warteschleife" diskreditiert mich nicht zu arg 😉...

Wäre für jegliche Hilfe extrem dankbar!
Gruss Ron
 
ronbigb hat gesagt.:
..Es wird mir schliesslich immer nur das letzte mit add() hinzugefügte Panel dargestellt.
Das erste Panel mit der ersten Grafik erscheint schlicht nie!
Das Problem lässt sich lösen indem man einen neuen Thread startet.
Etwa so:
Code:
//package applets;
/*
 * Basics01.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Basics01 extends JApplet implements ActionListener{
    public void init() {
        image1 = getImage( getCodeBase(), "img2.gif" );//sex
        image2 = getImage( getCodeBase(), "img1.gif" );//B
        panel1 = new MyPanel(image1);
        getContentPane().add(panel1);

//eine Möglichkeit:
        timer = new Timer(2000, this);//alle 2 Sekunden actionPerformed() aufrufen
        timer.start();

//eine andere Möglichkeit:
//        new Thread(new Runnable(){
//            public void run() {
//                try{Thread.sleep(2000);}catch(InterruptedException ex){}
//                paintBild(image2);
//            }
//        }).start();

    }
    public void actionPerformed(ActionEvent e) {
        timer.stop();//ohne stop() erfolgt ein dauernder Bildwechsel
        bild2 = !bild2;
        paintBild(bild2?image2:image1);
    }
    private void paintBild(Image image){
        panel1.img = image;
        panel1.repaint();
    }
    private MyPanel panel1;
    private Image image1, image2;
    private javax.swing.Timer timer;
    private boolean bild2;
}
class MyPanel extends JPanel{
    Image img;
     MyPanel(Image img){
        this.img = img;
    }
     public void paintComponent( Graphics g ) {
        super.paintComponent(g);
        g.drawImage( img, 0, 0, this );
    }
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben