JButton.setIcon

Hallo!
Ich bin gerade dabei ein Java Applet zu programmieren. Doch mir stellt sich ein Problem.
Geplant ist es, aus einem Bild einen Button, möglichst JButton zu machen.
Durch langes herumsuchen hab ichs immerhin schon mal hinbekommen, ein Bild im png oder jpg Format einzulesen und g.drawImage() auch auf die Leinwand zu bekommen.
Wenn ich jetzt allerdings das Image in ein ImageIcon umwandele und das als Button icon über button.setIcon einstelle sehe ich nichts, wenn ich anschließen ein add(button) ausführe.

Code:
public class test extends Applet {
        public JButton b;
        public Icon i;
        public Image img;

        public void init(){
            img = getImage(getCodeBase(),"testbutton.png");
            i = new ImageIcon(img);
            b = new JButton();
            b.setIcon(i);
        }
        public void paint(Graphics g){
            //g.drawImage(img,3,2,this); //<-- würde Funktionieren
            add(b);  //<-- leerer Bildschirm
        }
}
 
Nun ... lass es mich mal sehr einfach ausdrücken : ein
Java:
Container.add(Component)
hat auch in der paint()-Methode überhaupt nichts verloren. Wenn dann gehört das add(JButton) in init() oder start() ... aber doch nicht in paint().
 
Also ich habs jetzt mal so abgeändert.. aber das bringt irgendwie auch nix.

Code:
    public class First extends Applet {
        public JButton b;
        public Icon i;
        public Image img;

        public void init(){
        img = getImage(getCodeBase(),"testbutton.png");
        i = new ImageIcon(img);
        b = new JButton();
        b.setIcon(i);
    }
    public void start(){
        add(b);
    }
        public void paint(Graphics g){
     }
}
 
Ok .. nächste Frage : siehst du überhaupt nichts oder nur kein Bild ?
Setze zum Testen einfach ein ein Label für den Button.
 
Also ich hab mal zwei Dinge versucht:

Code:
public class First extends Applet {
        public JButton b;
        public Icon i;
        public Image img;
        public Label l;
        public void init(){
        l = new Label("test");
        img = getImage(getCodeBase(),"testbutton.png");
        i = new ImageIcon(img);
        b = new JButton("hi");
        //b.setIcon(i);
    }
    public void start(){
        add(b); //<-- erscheint
        add(l);  //<--erscheint nicht
    }
        public void paint(Graphics g){
     }
}
 
Dann ist es ganz klar :
img ist null oder nocht nicht vollständig geladen.
Ich finde es eh sehr umständlich das du das png übers Netz nachladen willst. Packs doch mit dem Applet in ein JAR und lad es über this.getClass().getResource().
 
Also ich bin halt in dem Applet Bereich und Grafik noch unerfahren.. hab mich bisher eher mit Algorithmen beschäftigt. Ganz gut wär auch, wenn ich wüsste, wie ich den Button an ne bestimmte Stelle bringen kann (int höhe, int tiefe), oder die Größe regulieren (int breite, int höhe) sowas wär cool.
Könntest du mir vielleicht ein Beispielcode schreiben? Das Bild ist im Gleichen Ordner wie das Programm.

Aber schon mal danke für die Antwort, das wird mich bestimmt weiterbringen.
 
Natürlich bin ich da so nett und schreib dir das mal als Pseudo-Code.
Wichtige Vorraussetzung : das Jar muss richtig zusammengepackt werden. Nähere Infos über die verwendung des Tools jar bekommst du hier : http://download.oracle.com/javase/7/docs/technotes/guides/jar/index.html
Schau dir am besten das Tutorial an. Dort wird alles genau erklärt. Bei Fragen bitte konkrete Probleme beschrieben.

Wie du eine Component auf einem Container platzierst findest du in der API-Doc *Link in meiner Signatur*.
Wie genau das geht kannst du hier erfahren : http://download.oracle.com/javase/7/docs/technotes/guides/swing/index.html
Auch hier wieder der Rat : arbeite das Tutorial durch.

So , und wie man nun ein Bild aus einem Jar des Applets läd schreib ich mal schnell als Pseudo-Code
Java:
BufferedImage bi=ImageIO.read(this.getClass().getResourceAsStream("icon.png"))
Dafür brauchst du die Pakete
javax.imageio.*
java.awt.image.*

Ich bitte dich nun zu deinem eigenen Wohl und um die Flut von Fragen zu minimieren erst einmal die beschriebenen Tutorials durchzuarbeiten und nur bei konkreten Problemen diese zu posten. Auch benutze bitte die Suchfunktion und Google für weitere Infos.

Ich hoffe ich konnte dich dazu animieren erstmal selbst zu versuchen es hinzubekommen bevor ich dir eine vollständige Lösung poste.
 
Zurück