Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Desktop-Applikationen und Grafik > Problem mit Zugriff von externer class auf Panel
Antwort
 
Themen-Optionen
Alt 20.12.2004, 11:55   Nach oben    #1
Treter_Peter
Gast
 
Beiträge: n/a
Standard Problem mit Zugriff von externer class auf Panel

Hi@all,
hab folgendes Problem:
nachdem ein Button gedrückt wird soll ein Grafikcontainer,
welcher über eine externe Klasse
augerufen wird, auf ein "Panel p" dargestellt werden.
Dummerweise funktioniert das nur wenn es vom Start des Progs. an Angezeigt wird,
nicht aber aus dem Eventhaendler heraus. Warum? Wo liegt mein Denkfehler?
P.S. Code fehlerfrei Compiliert und ich bin nen Noob, also versucht es mir so leicht wie moeglich zu erklären. Hier der Code:

//Bilder.java created by Treter_Peter for Suse Linux 9.2
import java.awt.*;
import java.awt.event.*;

public class Bilder extends Frame implements ActionListener{

public static void main(String args[]){
Bilder b = new Bilder();
b.show();
}

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
Button b, be;
Panel p; //Im Prinzip ein Fenster im Fenster sollte im zusammenhang mit paint() genutzt werden
Label l;
public Bilder(){
setTitle("Bild laden und Anzeigen");
setBackground(Color.lightGray);
setSize(660,400); //Breite,Hoehe
setLocation((dim.width - getSize().width)/2,(dim.height - getSize().height)/2);
setLayout(null);

//--------------------------------------------------------------------------------------
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
//--------------------------------------------------------------------------------------
p = new Panel();
p.setBackground(Color.red);
p.setBounds(10,30,640,320);
p.setLayout(new GridLayout(1,1));
//p.add(new Bildcontainer(this,"fbi.jpg")); //Hier funktionierts aber
add(p);

b = new Button("OK");
b.setBounds(10,360,100,30);
b.addActionListener(this);
add(b);

be = new Button("Beenden");
be.setBounds(120,360,100,30);
be.addActionListener(this);
add(be);

l = new Label("");
l.setBounds(230,360,100,30);
add(l);
}
public void actionPerformed(ActionEvent ev){
if(ev.getActionCommand().equals("OK")){
p.add(new Bildcontainer(this,"fbi.jpg")); //Warum funktioniert das nicht?
}else{ System.exit(0); }
}
}
class Bildcontainer extends Canvas{

Image bild;
Bilder bi;
int Posx, Posy;

Bildcontainer(Bilder z,String Dateiname){
bi = z;
bild = getToolkit().getImage(Dateiname);

MediaTracker mt = new MediaTracker(this); //Wichtig, damit Bild(er) erst vollst. geladen werden
mt.addImage(bild, 0); //befor es weitergeht
try{ mt.waitForAll(); }
catch(InterruptedException IE){ System.out.println("Fehler im mt"); }

Positions();
}
void Positions(){
int Panelx = bi.p.getWidth();
int Panely = bi.p.getHeight();
int Bildx = bild.getWidth(this);
int Bildy = bild.getHeight(this);
Posx = (Panelx-Bildx)/2;
Posy = (Panely-Bildy)/2;
if(Posx <= 0 || Posy <= 0){ Posx = 0; Posy = 0; System.out.println("<=0"); }

repaint();
}
public void update(Graphics g){paint(g);}
public void paint(Graphics g){
if(bild != null){
g.drawImage(bild,Posx,Posy,this);
}
}
}
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.12.2004, 16:58   Nach oben    #2
LordOfCodes
Gast
 
Beiträge: n/a
Standard

Hi

Also als erstes: Bitte benutze den "Code"-Tag um Quelltext zu posten. Das sieht dann viel leserlicher aus:

Java Code:
  1. // Bilder.java created by Treter_Peter for Suse Linux 9.2
  2.  
  3. import java.awt.*;
  4. import java.awt.event.*;
  5.  
  6. public class Bilder extends Frame implements ActionListener {
  7.  
  8.     public static void main(String args[]) {
  9.         Bilder b = new Bilder();
  10.         b.show();
  11.     }
  12.  
  13.     Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
  14.     Button    b, be;
  15.     Panel     p;
  16.     Label     l;
  17.  
  18.     public Bilder() {
  19.         setTitle("Bild laden und Anzeigen");
  20.         setBackground(Color.lightGray);
  21.         setSize(660, 400); //Breite,Hoehe
  22.         setLocation((dim.width - getSize().width) / 2,
  23.                 (dim.height - getSize().height) / 2);
  24.         setLayout(null);
  25.  
  26.         //--------------------------------------------------------------------------------------
  27.         addWindowListener(new WindowAdapter() {
  28.             public void windowClosing(WindowEvent ev) {
  29.                 System.exit(0);
  30.             }
  31.         });
  32.         //--------------------------------------------------------------------------------------
  33.         p = new Panel();
  34.         p.setBackground(Color.red);
  35.         p.setBounds(10, 30, 640, 320);
  36.         p.setLayout(new GridLayout(1, 1));
  37.         //p.add(new Bildcontainer(this,"fbi.jpg")); //Hier funktionierts aber
  38.         add(p);
  39.  
  40.         b = new Button("OK");
  41.         b.setBounds(10, 360, 100, 30);
  42.         b.addActionListener(this);
  43.         add(b);
  44.  
  45.         be = new Button("Beenden");
  46.         be.setBounds(120, 360, 100, 30);
  47.         be.addActionListener(this);
  48.         add(be);
  49.  
  50.         l = new Label("");
  51.         l.setBounds(230, 360, 100, 30);
  52.         add(l);
  53.     }
  54.  
  55.     public void actionPerformed(ActionEvent ev) {
  56.         if (ev.getActionCommand().equals("OK")) {
  57.             p.add(new Bildcontainer(this, "fbi.jpg")); //Warum funktioniert das
  58.                                                        // nicht?
  59.         }
  60.         else {
  61.             System.exit(0);
  62.         }
  63.     }
  64. }
  65.  
  66. class Bildcontainer extends Canvas {
  67.  
  68.     Image  bild;
  69.  
  70.     Bilder bi;
  71.  
  72.     int    Posx, Posy;
  73.  
  74.     Bildcontainer(Bilder z, String Dateiname) {
  75.         bi = z;
  76.         bild = getToolkit().getImage(Dateiname);
  77.  
  78.         MediaTracker mt = new MediaTracker(this); //Wichtig, damit Bild(er)
  79.                                                   // erst vollst. geladen werden
  80.         mt.addImage(bild, 0); //befor es weitergeht
  81.         try {
  82.             mt.waitForAll();
  83.         }
  84.         catch (InterruptedException IE) {
  85.             System.out.println("Fehler im mt");
  86.         }
  87.  
  88.         Positions();
  89.     }
  90.  
  91.     void Positions() {
  92.         int Panelx = bi.p.getWidth();
  93.         int Panely = bi.p.getHeight();
  94.         int Bildx = bild.getWidth(this);
  95.         int Bildy = bild.getHeight(this);
  96.         Posx = (Panelx - Bildx) / 2;
  97.         Posy = (Panely - Bildy) / 2;
  98.         if (Posx <= 0 || Posy <= 0) {
  99.             Posx = 0;
  100.             Posy = 0;
  101.             System.out.println("<=0");
  102.         }
  103.  
  104.         repaint();
  105.     }
  106.  
  107.     public void update(Graphics g) {
  108.         paint(g);
  109.     }
  110.  
  111.     public void paint(Graphics g) {
  112.         if (bild != null) {
  113.             g.drawImage(bild, Posx, Posy, this);
  114.         }
  115.     }
  116. }

Zu deinem Problem:
Da du etwas zum panel hinzufügen willst, nach dem du es (bzw. das ganze fenster) sichtbar gemacht hast, musst du es validieren (dem layoutmanager mitteilen, dass du was nach dem sichtbarmachen hinzugefügt hast) und neu zeichnen (repaint).
Probier mal folgendes:
Java Code:
  1. p.add(new Bildcontainer(this, "fbi.jpg")); //Warum funktioniert das nicht?                                                   
  2. //füge folgende zeilen dort ein:
  3. p.validate();
  4. p.repaint();
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.12.2004, 13:22   Nach oben    #3
Treter_Peter
Gast
 
Beiträge: n/a
Standard Danke, Danke

Hi@all,
ich Danke dir erstmal, hat das Problem so weit gelöst.
Hab aber gemerkt das mein Aufruf ziemlich blöd ist, weil er ja nicht mit jeden Tastendruck
nen neuen Bildcontainer anlegen soll, sondern den alten ersetzten.
Aber da ich das Problem erkannt habe, finde ich hoffentlich auch die Lösung.
Mfg und Danke nochmal Treter_Peter
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zugriff auf Konfiguration im verschachtelten Array Ben PHP-Programmierung 5 02.02.2007 12:47
Vokabeltrainer asenodin Allgemeine Java-Programmierung 9 28.05.2006 21:04
Line2D.Double-Objekt auf Panel zeichnen - kein Graphics-Objekt vorhanden :-/ Ben Desktop-Applikationen und Grafik 10 02.03.2006 15:34
Referenc auf das oberste Panel eines CardLayouts bekommen Arvodan Desktop-Applikationen und Grafik 1 20.01.2006 08:39
dynamischer Zugriff auf statische Eigenschaft einer Klasse Ben PHP-Programmierung 10 15.11.2005 15:53


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:14 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44