Buttons

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

Rico

Gast
Also ich habe bei mir folgendes Problem, und zwar nutze ich folgende Quelltexte für jeden Button den ich bei mir in ein Frame einbinde:

Code:
import javax.swing.*;

private JButton button1 = new JButton();

this.add(button1);
button1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent evt) {
button1ActionPerformed(evt); } });

public void button1ActionPerformed(final ActionEvent evt) {
//Hier kommt die Ereignisprozedur des Buttons rein
}

Wenn ich den oben Quellcode oben für jeden Button nehme dann erstellt Java ür jeden Button eine Klasse. Nun habe ich in meinem Spiel insgesamt 32 Buttons und die ganzen Klassen nerven so mit der Zeit. Kann man das nicht irgendwie so machen, dass Java nicht mehr für jeden Button eine extra Klasse macht?
 
Doch natürlich. Hier ein Beispiel

Code:
public class ThreeButtons extends JFrame implements ActionListener {
  JButton button1 = new JButton();
  JButton button2 = new JButton();
  JButton button3 = new JButton();

  public ThreeButtons () {
    super ("3 Buttons");
    setLayout (new FlowLayout ());
    getContentPane().add (button1);
    getContentPane().add (button2);
    getContentPane().add (button3);
    button1.addActionListener (this);
    button2.addActionListener (this);
    button3.addActionListener (this);
  }
 
  public void actionPerformed (ActionEvent ae) {
    //Hier dann implementieren was geschehen soll
    // mit ae.getSource() kann bestimmt werden welches Objekt das ActionEvent erzeugt hat
  }
 
  public static void main (String[] args) {
    ThreeButtons tb = new ThreeButtons();
    tb.setSize (300,100);
    tb.setVisible(true);
  }
}

sollte gehen. habs jetzt aber nur so daher getippt
 
Dein Quellcode ist schon mal sehr nützlich, aber es ist bei mir so, dass, das ich bei mir auf dem Frame ein Null-Layout verwenden will und die Buttons an unterschiedlichen Stellen platziert habe.

Und dann noch die Frage, warum steht da bei allen Klassen "public" davor, reicht da nicht auch "privat"? Die Klasse mit den Buttons soll ja nicht von anderen Klassen verwendet werden!
 
Könnte mir jemand erklären wie ich das machen soll wenn ich Beispielsweise 3 Buttons habe:

Code:
public void actionPerformed (ActionEvent ae) { 
    //Hier dann implementieren was geschehen soll 
    // mit ae.getSource() kann bestimmt werden welches Objekt das ActionEvent erzeugt hat 
}

Wie wende ich "ae.getSource()" an wie schreibe ich etwas wenn der eine Button etwas ausführen soll, z.B. der eine Button soll das hier ausführen "this.setTitle("Framename");"?
 
Kannst ja auch die "Beschriftung" holen zur Unterscheidung der Buttons, mit :

Code:
event.getActionCommand()

Da kannst du dann die einzelnen auch ganz leicht unterscheiden.
 
könnte das jemand ein wenig mehr verständlicher beschreiben? Ich habe halt bislang kaum Ahnung von dem graphischen Java, da ich bislang alles mit der DOS-Box gelöst habe.

Wie weise ich denn nun einem Button eine Aktion zu?

Wenn ich das mit dem Quelltext mache geht es nicht:

Code:
public void s1karte25ActionPerformed(ActionEvent evt) {
    this.setTitle("Framename");
}

da er meldet, das er nicht mit den folgenden Quelltextzeilen arbeiten kann:

Code:
public class spiel extends JFrame implements ActionListener {

Wie muss ich nun das heir anwenden: ?
Code:
event.getActionCommand()
 
Code:
public void actionPerformed(ActionEvent ae){
    if(ae.getActionCommand().equals("Buttonbeschriftung")){
        //tu was...
    }
}
 
Das mit "equals" geht bei mir nicht, da ich keine Buttonbeschriftung habe! Statt der Buttonbeschriftung nehme ich Bilder, die jedoch immer bei dem Button varieren, da ich das so mache, das ich Buttons bei mir im Kartenspiel habe, die dann immer per Zufall mit Bildern von Karten bestückt werden. Kann man das nicht irgendwie über die Variable des Buttons statt mit der Beschriftung des Buttons lösen?
 
Code:
public void actionPerformed(ActionEvent ae){
    if(ae.getSource().equals(button)){
        //tu was...
    }
}
 
ich habe nun wie oben beschrieben meine Buttons angelgt. Nun besteht aber ein Problem, und ich weiß nicht woran es liegt. Mein Quelltext:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class game extends Frame implements ActionListener {
  int x = 100;
  private JButton s1karte[] = new JButton[4];
  
  public game(String spielname) {

    addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent evt){
        System.exit(0);
      }
    });

    this.setTitle(spielname);
    this.setSize(800, 600);
    this.setBackground(new Color(0, 127, 0));
    this.setLayout(null);
    this.setVisible(true);
    this.setResizable(false);

    for(int i=1; i<=4; i++){
      s1karte[i].setBounds(x,50,80,110);
      x += 20;
      this.add(s1karte[i]);
      s1karte[i].addActionListener(this);
    }
  }
  
  public void actionPerformed(ActionEvent ae){
    if(ae.getSource().equals(s1karte[1])){
      //Ereignisprozedur
    }

    if(ae.getSource().equals(s1karte[2])){
      //Ereignisprozedur
    }

    if(ae.getSource().equals(s1karte[3])){
      //Ereignisprozedur
    }

    if(ae.getSource().equals(s1karte[4])){
      //Ereignisprozedur
    }
  }
  
  public static void main(String[] args) {
    new game("Kartenspiel");
  }
}

Hat jemand eine Idee, was an meinen Buttons falsch ist? Darf man überhaupt sowas mit der For-Schleife machen, wo die Objekte mit add(button) eingefügt werden?
 
Code:
   if(ae.getSource().equals(s1karte[4])){
Arrays fangen an bei 0 zu zählen, dein Array kann 4 Elemente aufnehmen, demnach liegt s1karte[4] außerhalb der Array-Grenzen.
 
das Problem besteht aber immer noch, wenn ich den Index vom Array ändere:

Code:
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class test extends Frame implements ActionListener { 
  int x = 100; 
  private JButton s1karte[] = new JButton[3];
  
  public test(String spielname) {

    addWindowListener(new WindowAdapter(){ 
      public void windowClosing(WindowEvent evt){ 
        System.exit(0); 
      } 
    }); 

    this.setTitle(spielname); 
    this.setSize(800, 600); 
    this.setBackground(new Color(0, 127, 0)); 
    this.setLayout(null); 
    this.setVisible(true); 
    this.setResizable(false); 

    for(int i=0; i<=3; i++){
      s1karte[i].setBounds(x,50,80,110); 
      x += 20; 
      this.add(s1karte[i]); 
      s1karte[i].addActionListener(this); 
    } 
  } 
  
  public void actionPerformed(ActionEvent ae){ 
    if(ae.getSource().equals(s1karte[0])){
      //Ereignisprozedur 
    } 

    if(ae.getSource().equals(s1karte[1])){
      //Ereignisprozedur 
    } 

    if(ae.getSource().equals(s1karte[2])){
      //Ereignisprozedur 
    } 

    if(ae.getSource().equals(s1karte[3])){
      //Ereignisprozedur 
    } 
  } 
  
  public static void main(String[] args) { 
    new test("Kartenspiel");
  } 
}

Was mache ich falsch, und wo liegt der Fehler? Könnte jemand gleich den Quelltext richtig aufschreiben?
 
Anonymous hat gesagt.:
Code:
  private JButton s1karte[] = new JButton[3];
Willst du nun 3 Buttons oder 4? Wenn du 4 willst dann lass die 4 hier stehen

Code:
    for(int i=0; i<=3; i++){
      s1karte[i].setBounds(x,50,80,110); 
      x += 20; 
      this.add(s1karte[i]); 
      s1karte[i].addActionListener(this); 
    } 
  }
Was mache ich falsch, und wo liegt der Fehler? Könnte jemand gleich den Quelltext richtig aufschreiben?

Du deklarierst das Feld von Buttons, aber es fehlt so was wie:

Code:
for(int i = 0;i <= 3;i++) {
s1karte[i] = new JButton("Button "+i);
...
Du musst du Buttons auch richtig initialisieren...
 
Btw. was ich (<- Gast) noch vergessen hab :
- Klassennamen werden groß geschrieben

Warum verwendest du eigentlich das null - Layout?

Mit den Änderungen sollte zumindest keine ArrayIndexOutOfBoundsException mehr auftauchen.

Hab jetzt auch den ActionListener getestet, er erkennt so richtig welcher Button gedrückt wurde.

Aber: Das Layout sieht so noch sehr "unschön" aus
 
auch wenn es hier nicht in den Thread reinpasst, aber welches Laout ist dann am besten, wo man auch Bounds für Objekte setzen kann?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben