actionlistener

silson

Aktives Mitglied
hallo, ich habe ein bild erstellt und ein buttton...
wenn ich auf den button klicke soll das bild erscheinen...
das problem ist, wenn ich das in den sourcordner kopiere und programmiere funktioniert das nicht.
mache ich das ganze in einen img- ordner funktioniert das zwar in eclipse programm aber im jarfile bekomme ich nur das buttonbild angezeigt und wenn ich drauf klicke bleid das bild weg...
woran liegt da der unterschied.

Code:
package de.test.java;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Main extends JFrame {
   
//    JLabel bild1;
//    Icon textPause;
   
    JButton buttonPause;
   
    JLabel textPause = new JLabel();
   
    public Main(){
       
        Icon c = new ImageIcon(getClass().getResource("button pause orange.jpg"));
        Icon d = new ImageIcon(getClass().getResource("button pause blau.jpg"));
        buttonPause = new JButton("", c);
        buttonPause.setRolloverIcon(d);
        buttonPause.setBounds(700, 20, 59, 84);
        buttonPause.setBorder(null);
        buttonPause.addActionListener(new ButtonHaendler());
        add(buttonPause);
       
        add(textPause);
//        add(bild1);
    }
   
    class ButtonHaendler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
           
            if(e.getSource()== buttonPause){
               
//                textPause = new ImageIcon(getClass().getResource("text pause.png"));
//                bild1 = new JLabel(textPause);
//                bild1.setBounds(150, 180, 1205, 284);
               
                textPause.setIcon(new ImageIcon("img/text pause.png"));
                textPause.setBounds(150, 180, 1205, 284);
            }
        }
       
    }

    public static void main(String[] args) {
        Main frame = new Main();
        frame.setTitle("main");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1500, 600);
        frame.getContentPane().setLayout(null);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.getContentPane().setBackground(new Color(0, 0, 20));
    }
}
 
Mit new ImageIcon("img/text pause.png") wird ja auch keine Ressource aus einer jar Datei geladen.

Gab hier im Forum auch schon sehr viele Threads zum Laden von Files aus dem jar File. getResourceAsStream sollte die Lösung sein.
 
Und drei Zeilen drüber hast du es doch richtig gemacht !!!!! Schau deinen eigenen Code an ....

ich weiss es funktioniert aber mit dem getResource code nicht...woran liegt das denn?
wäre um ein ratschlag sehr erfreut.

wenn ich das ganze ohne nen actionlistener mache geht es.
das bild ist da.
und wenn ich nen jardatei erstelle auch.
nur mit den actionlistener macht das ganze probleme
 
Also das könnte einfach daran liegen, dass dies nun in einer inner Class stattfindet. Evtl. solltest Du das getRessource des classloaders nutzen oder keinen relativen Pfad angeben (Sprich: mit / starten und den korrekten pfad angeben). Das ist zumindest der Unterschied, den ich hier sehe.

Siehe auch http://stackoverflow.com/questions/...class-getresource-and-classloader-getresource


danke aber die seite bringt mir nix, weil ich kein englisch kann.
und das / starten habe ich auch schon probiert aber geht trotzdem nicht.
 
Du kannst statt getClass() auch Main.class nutzen, das funktioniert auch in anonymen Klassen. Main ist dabei der Klassenname und hat nichts mit main(..) zu tun^^
 
danke, aber hat auch nicht funktioniert...
nur wenn ich das ganze vor dem actionlistener mache, dann geht jeder scheiss code...
hat keiner ne andere lösung?
nix ist schlimmer wenn man was machen will und nichts funktioniert und keiner kann einen helfen.
 
ImageIcon schon vorm Erstellen des ActionListeners laden, aber erst innerhalb setzten?

meinst du die zeile hier
textPause = new ImageIcon(Main.class.getResource("text pause.png"));
vor dem actionlistener setzten.
habe ich gemacht, geht aber auch nicht.
kennt nicht irgend jemand ne 2 oder 3 zeiligen code zum ändern das es funktioniert?

Code:
package de.main.java;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Main extends JFrame {
 
    JLabel bild1;
    Icon textPause;
 
    JButton buttonPause;
 
 
    public Main(){
     
        Icon c = new ImageIcon(getClass().getResource("button pause orange.jpg"));
        Icon d = new ImageIcon(getClass().getResource("button pause blau.jpg"));
        buttonPause = new JButton("", c);
        buttonPause.setRolloverIcon(d);
        buttonPause.setBounds(700, 20, 59, 84);
        buttonPause.setBorder(null);
        buttonPause.addActionListener(new ButtonHaendler());
        add(buttonPause);
     
        add(bild1);
    }
 
 
    class ButtonHaendler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
         
            if(e.getSource()== buttonPause){
             
                textPause = new ImageIcon(Main.class.getResource("text pause.png"));
                bild1 = new JLabel(textPause);
                bild1.setBounds(150, 180, 1205, 284);
            }
        }
     
    }

    public static void main(String[] args) {
        Main frame = new Main();
        frame.setTitle("main");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1500, 600);
        frame.getContentPane().setLayout(null);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.getContentPane().setBackground(new Color(0, 0, 0));
    }
}
 
Du kannst statt getClass() auch Main.class nutzen, das funktioniert auch in anonymen Klassen
So ganz anonym ist die innere Klasse ja nicht. Ist im Moment nur Rumgestochere aber hast du es schon mal mit ButtonHaendler statt mit Main versucht ?

Code:
textPause = new ImageIcon(ButtonHaendler.class.getResource("text pause.png"));
 
Wenn der Aufruf in der Main() funktioniert, dann lade das Icon textPause doch da, wo Du die Icons c und d lädst. Und nutz den gleichen Code wie dort. Wobei ich fast zweifle, dass es daran liegt - hast Du einmal geprüft, ob das Bild da ist und du alles richtig geschrieben hast?
 
kneifel das bild soll erst erscheinen wenn ich auf den button drücke.
also muss es in den listener rein.
oder hast du einen anderen code für mich.

jstein52, weiss nicht was du meinst
 
Das Bild erscheint doch nicht, wenn Du das Icon lädst. Das Bild erscheint doch erst, wenn Du es in der GUI erzeugst.
 
kneitzel....wir reden die ganze zeit aneinander vorbei....
wenn du keinen vorschlag hast dann schreibe besser nichts...
bin gerade genervt....
son pisiger code und keiner hat ahnung
 
Versuch doch einfach einmal zu verstehen, was andere Dir schreiben! Aber ist ja ok, dass ich keine Ahnung habe, aber meine nicht Ahnung kann ich ja mal weiter geben.

Code:
                textPause = new ImageIcon(Main.class.getResource("text pause.png"));
Dieser Code lädt lediglich ein ImageIcon. Durch das laden dieses ImageIcons wird abolut nichts in der GUI angezeigt. Dieses ImageIcon könntest Du - so wie es andere gesagt haben - ausserhalb des ActionListeners durchführen.

Code:
                bild1 = new JLabel(textPause);
                bild1.setBounds(150, 180, 1205, 284);
Damit erstellst Du ein JLabel. Was mich etwas wundert an Deinem Code ist, dass Du im Main ein add(bild1) hast - also zu einem Zeitpunkt, bei dem bild1 noch nicht gesetzt ist ... Aber das liegt bestimmt daran, dass ich keinerlei Ahnung habe 🙂
 
hast du auch nicht...das add(bild1)...ruft lediglich das bild auf...du schlaumeier...
und die zeile mit dem getResource habe ich schon ausserhalb vom listener geschrieben...wenn du aufgepasst hättest...
bin anfänger aber glaube du bist auch einer.
brauche eine lösung und nicht vorschläge die ich schon probiert habe.
jstein52 hat nen vorschlag gebracht den ich dankend angenommen habe, der aber er leider auch nicht ging und gut ist...da muss man nicht noch weiter schreiben
 
Dann gib doch einmal den aktuellen Code. Und eine genaue Fehlermeldung. Was passiert genau? Ich vermute, dass das Problem ist, dass Du das Control im ActionListener erzeugst und nicht hinzu fügst. Da keine vernünftige Fehlermeldung von Dir abgegeben wurde, wurde am Laden der Ressource rumgebastelt, was aber wohl nicht das Problem ist, denn Du hast nichts von einer NullPointerException gesagt.

Das Problem stellt sich mir daher wie folgt da:
Im Konstruktor hast Du ein add(bild1), bild1 ist aber an der Stelle null, so dass nichts hinzugefügt wurde.
Im ActionListener weist Du der Variable bild1 nun ein Control zu, aber dieses fügst Du nicht hinzu, daher wird einfach nichts angezeigt.

Ein Vergleich mit der realen Welt wäre: Du hast einen Parkplatz. Der ist leer. Und du sagst jemanden: Erfasse das Auto auf dem Parkplatz. Der geht hin, auf dem Parkplatz steht kein Auto und damit ist es dann erledigt.
Nun stellst Du ein Auto auf den Parkplatz, aber dadurch wird das Auto nicht erfasst. Der Erfass Vorgang, den Du angestoßen hattest, ist ja vorbei ...

Und natürlich - ich bin ein blutiger Anfänger und habe absolut keine Ahnung von Software-Entwicklung. Da ich aber Angst habe, dass mein Arbeitgeber, der mich als Senior Software Engineer bezahlt, das mitbekommt, lasse ich Dich und diesen Thread jetzt tatsächlich in Ruhe. Solche Diskussionen muss ich mir schlicht nicht geben. Viel Erfolg noch.
 
mrbrown...so sieht er derzeit aus...

Code:
package de.main.java;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Main extends JFrame {
   
    JLabel bild1;
    Icon textPause;
   
    JButton buttonPause;
   
   
    public Main(){
       
        Icon c = new ImageIcon(getClass().getResource("button pause orange.jpg"));
        Icon d = new ImageIcon(getClass().getResource("button pause blau.jpg"));
        buttonPause = new JButton("", c);
        buttonPause.setRolloverIcon(d);
        buttonPause.setBounds(700, 20, 59, 84);
        buttonPause.setBorder(null);
        buttonPause.addActionListener(new ButtonHaendler());
        add(buttonPause);
    }
   
   
    class ButtonHaendler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
           
            if(e.getSource()== buttonPause){
               
                textPause = new ImageIcon(getClass().getResource("text pause.png"));
                bild1 = new JLabel(textPause);
                bild1.setBounds(150, 180, 1205, 284);
                add(bild1);
            }
        }
       
    }

    public static void main(String[] args) {
        Main frame = new Main();
        frame.setTitle("main");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1500, 600);
        frame.getContentPane().setLayout(null);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.getContentPane().setBackground(new Color(0, 0, 0));
    }
}
 
Code:
textPause = new ImageIcon(getClass().getResource("text pause.png"));

steht doch immer noch im ActionListener?
 
Ich habe den Code nun auch einmal bei mir ausprobiert - und interessanter weise wird nach einem add noch kein neues paint getriggert. In der Dokumentation vom Container steht das ja auch, aber man vergisst es leicht und übersieht dies auch gerne mal.

Auszug aus der (englischen) Doku:
"This method changes layout-related information, and therefore, invalidates the component hierarchy. If the container has already been displayed, the hierarchy must be validated thereafter in order to display the added component."

Also durch den Aufruf von add werden die Informationen über das Layout verändert und dadurch die Komponentenhierarchie ungültig gemacht. Wenn der Container bereits angezeigt wurde, muss die Hierarchie wieder verifiziert werden um die hinzugefügte Komponente anzuzeigen.

Und sorry, dass ich nochmal was geschrieben habe, aber ich hoffe doch, dass ich Dir damit etwas helfen konnte.
 
Evtl. der von mir angepasste Code:

Java:
@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource()== buttonPause){

        textPause = new ImageIcon(getClass().getResource("3.png"));
        bild1 = new JLabel(textPause);
        bild1.setBounds(150, 180, 1205, 284);
        add(bild1);
        repaint();
    }
}

Den Dateinamen muss man natürlich nicht ändern. Aber man erkennt hoffentlich, wo und wie ich das repaint() eingefügt habe.

Eigentlich würde ich sogar noch die folgende Erweiterung vorschlagen:
Java:
@Override
public void actionPerformed(ActionEvent e) {
    if (textPause != null)
        return;
   
    if(e.getSource()== buttonPause){
        textPause = new ImageIcon(getClass().getResource("3.png"));
        bild1 = new JLabel(textPause);
        bild1.setBounds(150, 180, 1205, 284);
        add(bild1);
        repaint();
    }
}
So würde nicht öfters das Bild angezeigt, d.h. wenn das bild schon angezeigt wurde ist textPause nicht mehr null und er springt direkt aus der Funktion.

Oder was evtl. auch ginge wäre etwas wie folgt:
Java:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame {
    JLabel bild1;
    Icon textPause;

    JButton buttonPause;

    public Main(){

        Icon c = new ImageIcon(getClass().getResource("1.png"));
        Icon d = new ImageIcon(getClass().getResource("2.png"));
        buttonPause = new JButton("", c);
        buttonPause.setRolloverIcon(d);
        buttonPause.setBounds(700, 20, 59, 84);
        buttonPause.setBorder(null);
        buttonPause.addActionListener(new ButtonHaendler());
        add(buttonPause);
        textPause = new ImageIcon(getClass().getResource("3.png"));
        bild1 = new JLabel(textPause);
        bild1.setBounds(150, 180, 1205, 284);
        add(bild1);
        bild1.setVisible(false);
    }

    class ButtonHaendler implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource()== buttonPause){
                bild1.setVisible(true);
            }
        }
    }

    public static void main(String[] args) {
        Main frame = new Main();
        frame.setTitle("main");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1500, 600);
        frame.getContentPane().setLayout(null);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.getContentPane().setBackground(new Color(0, 0, 0));
    }
}

Hier werden alle Controls, die benötigt werden, direkt initialisiert und lediglich die Sichtbarkeit gesteuert. Dadurch braucht man das manuelle repaint nicht mehr, da die Componenten beim setVisible die notwendigen Schritte selbst durchführt.
 
Zuletzt bearbeitet von einem Moderator:
kneizel danke dafür...
habe es mit repaint ausprobiert und es funktioniert...
aber die lösung mit dem setvisible finde ich besser bestimmt daher weil ich sie schon kenne...
sorry für gestern aber ich war voll gereizt, weil nix funktioniert hat und ich mit meinen anderen programm nicht mehr weiter kam...

also nochmals danke und sorry
 

Zurück
Oben