Actionlistener funktioniert nicht "ordnungsgemäß"

Martin951995

Grünschnabel
Hallo!
Ich habe folgendes Problem:
Ich will in einer frame ein männchen von links nach rechts wandern lassen und bei x=500pixel stoppen lassen.
Ich habe eine Klasse Schwert:
Code:
package beta;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class Schwert extends JLabel {
    

    public Schwert(int speed, int spieler) {


        setIcon(new ImageIcon("img\\Schwert.jpg"));
        setBounds(0, 270, 91, 139);
        setVisible(true);

    }

    public void move(int speed, Schwert s) {

        for (int i = 0; i <= 500; i = i + speed) {
            s = new Schwert(speed, 1);
            setBounds(i, 270, 91, 139);
            System.out.println(i);
            Programm.jlp.add(this, 0);
        }
    }

}

und wenn ich jetz in der main-Methode sage:
Code:
...
Schwert s = new Schwert(1, 1);
s.move(2, s);
...
dann passiert alles so wie ich es mir vorher gedacht hatte.
Aber wenn ich das im ActionListener aufrufe gibt er mir zwar keine Fehler meldung, aber er zeichnet mir nur das letzte Bild.

ich hoffe mir kann jemand helfen, danke für jede antwort im voraus
 
Zum einen kommt der genannte Listener nirgends in deinem gezeigten Code vor, andererseits
(nicht beleidigt sein) ist der gezeigte Code grauenhaft.

Was um alles in der Welt machst du da?!

Mit einem Aufruf von move erzeugst du 250 Schwerter, lädst 250 mal ein Bild von der Festplatte(bzw. RAM), fügst irgendeiner Collection 250 sinnfreie Objekte dazu...

Beschreib vielleicht einmal, was du genau vorhast, und poste den ganzen Code.

Und wer wandert jetzt eigentlich herum: Ein Männchen oder das (Multi-)Schwert?
 
ja kann sein, dass der code "grauenhaft" ist!:D
das liegt wahrscheinlich daran das ich noch nicht so lange programmiere!
also ich will eine figur namens schwert über die bildfläche wandern lassen...

Class Programm:

Code:
package beta;

import java.awt.*;

import javax.swing.JLabel;
import javax.swing.JLayeredPane;

public class Programm {

    static public Frame frame = new Frame();
    static public JLayeredPane jlp = new JLayeredPane();

    static JLabel labelMain = new JLabel();

    static Panel panel1 = new Panel();
    static Panel panel2 = new Panel();

    static Button button11 = new Button("Schwert");
    static Button button12 = new Button("Bogen");
    static Button button13 = new Button("");

    static Button button21 = new Button("Schwert (s)");
    static Button button22 = new Button("Bogen (b)");
    static Button button23 = new Button("");

    static ActionListner al = new ActionListner();

    static public Spielfeld sp = new Spielfeld();

    public static void anfang() {

        button21.setEnabled(false);
        button22.setEnabled(false);
        button23.setEnabled(false);

        button11.addActionListener(al);
        button12.addActionListener(al);
        button13.addActionListener(al);

        frame.setLayout(new BorderLayout());
        panel1.setLayout(new GridLayout(3, 1));
        panel2.setLayout(new GridLayout(3, 1));

        panel1.add(button11);
        panel1.add(button12);
        panel1.add(button13);

        panel2.add(button21);
        panel2.add(button22);
        panel2.add(button23);

        labelMain.setText("Spieler 1");

        jlp.add(sp, 1);
        frame.add(jlp, BorderLayout.CENTER);
        frame.add(panel1, BorderLayout.WEST);
        frame.add(panel2, BorderLayout.EAST);
        frame.add(labelMain, BorderLayout.NORTH);

    }

    public static void main(String[] args) {

        anfang();
        
        Schwert s = new Schwert(1, 1);  // das veranlasst, dass das "Schwert" von links nach rechts läuft

    }

}

Class Schwert:
Code:
package beta;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class Schwert extends JLabel {

    public int x;

    public Schwert(int speed, int spieler) {

        setIcon(new ImageIcon("img\\Schwert.jpg"));
        setBounds(x, 270, 91, 139);
        setVisible(true);
        this.move(speed, spieler);

    }

    public void move(int speed, int spieler) {

        if (spieler == 1) {
            for (int x = -90; x <= 860; x = x + speed) {

                setBounds(x, 270, 91, 139);
                System.out.println(x);
                Programm.jlp.add(this, 0);

            }
        } else {
            speed = speed * -1;
            for (int x = 860; x >= -90; x = x + speed) {

                setBounds(x, 270, 91, 139);
                System.out.println(x);
                Programm.jlp.add(this, 0);

            }
        }
    }

}
Class Frame:
Code:
package beta;

import javax.swing.JFrame;

public class Frame extends JFrame {

    public Frame(){
        
        setSize(1047, 431);
        setResizable(false);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
    }
}
Class ActionListener
Code:
package beta;

import java.awt.event.*;

public class ActionListner implements ActionListener {
	static String input;
	
	public void actionPerformed(ActionEvent a) {
		String input = a.getActionCommand();
		
		if (input == "Schwert"){
			System.out.println("ja");
			
			Schwert s = new Schwert(1, 1);

		}
		
		System.out.println(input);
	}
}
 
Zuletzt bearbeitet:
Moin,

was gibt Dir denn Dein "System.out.println(input)" der Klasse "ActionListener" aus, wenn Du den Button anklickst ? ? ?

gruß
Klaus
 
Hallo,

In deinem geposteten Code wird doch nie ein ActionCommand für einen Button gesetzt, da kann der input in der actionPerformed-Methode in deinem "ActionListner" niemals das von dir geforderte "Schwert" erreichen.

Lösungsvorschlag:
Java:
button11.setActionCommand( "Schwert" );

Gruß,
Martin
 
danke erst mal für die zahlreichen Antworten******
also wenn ich den meinen Button11 drücke dann gibt meine konsole schon etwas aus, unzwar das, das auf dem button steht! in dem falle "schwert". er gibt mir dann, wenn ich darauf gedrückt habe unten in der Konsole die ganzen neuen x coordinaten aus, aber er zeichnet sie mir nicht neu.
wenn ich aber ein neues objekt nahmens "schwert" in der main methode aufrufe dann macht er alles wie geplant!
 
In deinem geposteten Code wird doch nie ein ActionCommand für einen Button gesetzt, da kann der input in der actionPerformed-Methode in deinem "ActionListner" niemals das von dir geforderte "Schwert" erreichen.

Die Aussage ist falsch. Siehe: http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Button.html#getActionCommand()

Was aber an der Stelle definitiv geändert werden musst ist der String-Vergleich

Java:
//das wird nie wahr
if (input == "Schwert")

//das schon
if (input.equals("Schwert"))

Außerdem fügst du in jedem Schleifendurchlauf das Schwert erneut zum Panel hinzu. Das musst du nur einmal machen. Stattdessen versuch mal per Programm.jlp.repaint() die Fläche neu zu Zeichnen.
 
Zurück