Gå til innhold

Problemer med å hente variabler


Anbefalte innlegg

Jeg har lagt til en ActionListener til en knap

 

 

public class Buttons1 implements ActionListener {
String[] variabler = new String[3];
 
public Buttons1() {
 
 
variabler[0] = "Stein";
variabler[1] = "Saks";
variabler[2] = "Papir";
 
}
@Override
public void actionPerformed(ActionEvent e) {
Resultater res = new Resultater();
res.spiller1 = JOptionPane.showOptionDialog(null, "Hva skal spiller 1 velge?", "Valg Spiller 1", 0, 0, null, variabler, variabler[0]);
JOptionPane.showMessageDialog(null, "Du svarte: "+variabler[res.spiller1]);
 
 
}
 
}

Også har jeg en klasse som heter "Resultater"

public class Resultater{
public int spiller1;
public int spiller2;
 
public Resultater() {
System.out.println(spiller1);
 
}
 
}

Hvorfor blir ikke "spiller1" variabelen oppdatert fra Buttons1 klassen? Det eneste som kommer opp er "0".

Lenke til kommentar
Videoannonse
Annonse

Som en start, så blir linjen "System.out.println(spiller1);" kjørt når du lager Resultater, og den vil vel altid skrive ut 0 (til stdout) , siden det skjer før du har satt noen annen verdi.

 

Hvis du også får "Du svarte: 0" så må jeg nesten teste det selv før jeg svarer.

 

Edit: Det fungerte for meg, etter å ha skrevet akkurat nok kode til å få de fragmentene til å kjøre. Som sagt, den vil alltid skrive 0 på stdout, siden constructoren (public Klassenavn() ) blir kjørt når du lager objektet, mao. lenge før du har valgt noen verdi. Derimot blir popup-boksen riktig.

 

Det du antageligvis vil gjøre er noe sånt som dette:

I Resultater:
 
public String toString() {
    return "Spiller 1: " + spiller1 + " / spiller 2: " + spiller2;
}
 
I Buttons1:
System.out.println("Resultater: " + res);

Det vil fortsatt skrive ut 0/1/2 i stedet for teksten, men den vil i det minste bli oppdatert riktig. Du kan tenke på å flytte alternativene over til Resultater (kanskje som static?) og så bruke de i toString for å presentere det litt penere.

Endret av Djn
Lenke til kommentar

Altså "res.spiller1" kommer fortsatt bare på buttons1 klassen? Fordi jeg har en Buttons1 klasse og en Buttons2 klasse, og for å få de to til å samarbeide i klassen "Resultater" må jeg jo få de verdiene inn i Resultater slik at jeg eventuelt kan lage noen "if" setninger.

Lenke til kommentar

Skal vi se - og beklager at jeg har endret så mye på dette.

 

Variabelen res1 vil bare finnes inne i Button1, siden det er der du lager den, og den ikke blir returnert eller på noen annen måte sendt ut. Hvis du vil ta den med rundt i flere objekter, må du nesten lage den utenfor og sende den inn i de objektene som skal bruke den.

 

(Husk at det er mulig å lage så mange Resultater-objekter du vil, som er helt uavhengige.)

 

Hvis jeg tipper riktig på hvordan koden din ser ut, kan du prøve noe sånt som dette:

Button1.java og Button2.java:
 
public class Button1 extends ActionListener {
    Resultater res;
 
    public void setResultater(Resultater res) {
        this.res = res;
    }
 
@Override
    public void actionPerformed(ActionEvent e) {
        // eller res.spiller2 , om dette er Button2.java
        res.spiller1 = JOptionPane.showOptionDialog(null, "Hva skal spiller 1 velge?", "Valg Spiller 1", 0, 0, null, variabler, variabler[0]);
        JOptionPane.showMessageDialog(null, "Du svarte: "+variabler[res.spiller1]);
    }
}
 
 
 
Main.java (eller hva du nå bruker):
{
    Resultater res = new Resultater();
    Button1 b1 = new Button1();
    Button2 b2 = new Button2();

    b1.setResultater(res);
    b2.setResultater(res);
 
    (osv...)
}

Da får b1 og b2 det samme Resultater-objektet, og vil se hverandres endringer.

Endret av Djn
Lenke til kommentar

Jeg får error :/ her er alle klassene og det jeg har gjort:

Main()

public class Main {
 
public static void main(String[] args) {
Resultater res = new Resultater();
GameScreen gameS = new GameScreen();
gameS.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gameS.setVisible(true);
gameS.setSize(700, 500);
   
}
 
}

GameScreen()

public class GameScreen extends JFrame {
public GameScreen() {
Buttons1 bU1 = new Buttons1();
Buttons2 bU2 = new Buttons2();
FlowLayout fL = new FlowLayout();
this.setLayout(fL);
JButton spiller1 = new JButton("Spiller 1 Velg: Stein, Saks eller Papir");
JButton spiller2 = new JButton("Spiller 2 Velg: Stein, Saks eller Papir");
JLabel player1 = new JLabel("Spiller 1");
JLabel player2 = new JLabel("Spiller 2");
this.add(player1);
this.add(spiller1);
this.add(player2);
this.add(spiller2);
spiller1.addActionListener(bU1);
spiller2.addActionListener(bU2);
 
spiller1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JOptionPane.showMessageDialog(null, "Spiller 1 har trykket");
}
});
 
spiller2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JOptionPane.showMessageDialog(null, "Spiller 2 har trykket");
}
});
 
 
}
}

Buttons1()

public class Buttons1 implements ActionListener {
String[] variabler = new String[3];
    Resultater res;
    
    public void setResultater(Resultater res) {
        this.res = res;
    }
 
public Buttons1() {
variabler[0] = "Stein";
variabler[1] = "Saks";
variabler[2] = "Papir";
 
}
@Override
public void actionPerformed(ActionEvent e) {
res.spiller1 = JOptionPane.showOptionDialog(null, "Hva skal spiller 1 velge?", "Valg Spiller 1", 0, 0, null, variabler, variabler[0]);
JOptionPane.showMessageDialog(null, "Du svarte: "+variabler[res.spiller1]);
}
 
}

Buttons2()

public class Buttons2 implements ActionListener{
String[] variabler = new String[3];
    Resultater res;
    
    public void setResultater(Resultater res) {
        this.res = res;
    }
 
public Buttons2() {
variabler[0] = "Stein";
variabler[1] = "Saks";
variabler[2] = "Papir";
 
}
@Override
public void actionPerformed(ActionEvent e) {
res.spiller2 = JOptionPane.showOptionDialog(null, "Hva skal spiller 2 velge?", "Valg Spiller 2", 0, 0, null, variabler, variabler[0]);
JOptionPane.showMessageDialog(null, "Du svarte: "+variabler[res.spiller2]);
}
 
}

Resultater()

public class Resultater{
public int spiller1;
public int spiller2;
 
public Resultater() {
 Buttons1 b1 = new Buttons1();

Buttons2 b2 = new Buttons2();

 

b1.setResultater(this);

b2.setResultater(this);

} }

Endret av Emsal
Lenke til kommentar

Pynta litt på koden:

 

 

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
 
 
public class GameScreen extends JFrame {
String[] variabler = new String[3];
public int tall1;
public int tall2;
public GameScreen() {
 
variabler[0] = "Stein";
variabler[1] = "Saks";
variabler[2] = "Papir"; 
 
FlowLayout fL = new FlowLayout();
this.setLayout(fL);
JButton spiller1 = new JButton("Spiller 1 Velg: Stein, Saks eller Papir");
JButton spiller2 = new JButton("Spiller 2 Velg: Stein, Saks eller Papir");
JLabel player1 = new JLabel("Spiller 1");
JLabel player2 = new JLabel("Spiller 2");
this.add(player1);
this.add(spiller1);
this.add(player2);
this.add(spiller2);
 
spiller1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JOptionPane.showMessageDialog(null, "Spiller 1 har trykket");
tall1 = JOptionPane.showOptionDialog(null, "Hva skal spiller 1 velge?", "Valg Spiller 1", 0, 0, null, variabler, variabler[0]);
JOptionPane.showMessageDialog(null, "Du valgte: "+variabler[tall1]);
 
 
}
});
 
spiller2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
JOptionPane.showMessageDialog(null, "Spiller 2 har trykket");
tall2 = JOptionPane.showOptionDialog(null, "Hva skal spiller 2 velge?", "Valg Spiller 2", 0, 0, null, variabler, variabler[0]);
JOptionPane.showMessageDialog(null, "Du valgte: "+variabler[tall2]);
 
}
});
 
 
 
}
}
Endret av Emsal
Lenke til kommentar

Igjen: Koden du putter i Resultater() blir kjørt hver gang du gjør "new Resultater()". Du kan prøve å flytte de to linjene som kaller setResultater() til rett under der du faktisk lager Buttons1 og Buttons2 i GameScreen.

 

 

Med den sammenslåtte utgaven i den siste posten blir det mer spennende - det lager to anonymous inner classes, og det er begrenset hva man kan komme til derfra. Det enkleste er antageligvis å lage en funksjon i GameScreen og kalle den fra ActionListeneren, og å lage en Resultater i GameScreen-klassen som den oppdaterer. Noe som dette:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class GameScreen extends JFrame {

    String[] variabler = new String[3];
    public int tall1;
    public int tall2;
    public Resultater res;

    public GameScreen() {

        variabler[0] = "Stein";
        variabler[1] = "Saks";
        variabler[2] = "Papir";
 
        res = new Resultater();

        FlowLayout fL = new FlowLayout();
        this.setLayout(fL);
        JButton spiller1 = new JButton("Spiller 1 Velg: Stein, Saks eller Papir");
        JButton spiller2 = new JButton("Spiller 2 Velg: Stein, Saks eller Papir");
        JLabel player1 = new JLabel("Spiller 1");
        JLabel player2 = new JLabel("Spiller 2");
        this.add(player1);
        this.add(spiller1);
        this.add(player2);
        this.add(spiller2);

        spiller1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JOptionPane.showMessageDialog(null, "Spiller 1 har trykket");
                tall1 = JOptionPane.showOptionDialog(null, "Hva skal spiller 1 velge?", "Valg Spiller 1", 0, 0, null, variabler, variabler[0]);
                JOptionPane.showMessageDialog(null, "Du valgte: " + variabler[tall1]);
                updatePlayer(1, tall1);

            }
        });

        spiller2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                JOptionPane.showMessageDialog(null, "Spiller 2 har trykket");
                tall2 = JOptionPane.showOptionDialog(null, "Hva skal spiller 2 velge?", "Valg Spiller 2", 0, 0, null, variabler, variabler[0]);
                JOptionPane.showMessageDialog(null, "Du valgte: " + variabler[tall2]);
                updatePlayer(2, tall2);
            }
        });



    }
 
    public void updatePlayer(int player, int choice) {
        if (player==1) res.player1=choice;
        else if(player==2) res.player2=choice;
    }
}

Og Resultater:

public class Resultater{
    public int spiller1;
    public int spiller2;
}
Endret av Djn
  • Liker 1
Lenke til kommentar

Funket fett det, men går det an å dele variabelen choice individuelt for spiller1 og spiller2? Nå går begge under variabelen choice. Slik at jeg f.eks kan ha

    public void updatePlayer(int player, int choice) {

        if (player==1) res.player1=choice1;

        else if(player==2) res.player2=choice2;

    }
Lenke til kommentar

Et lite problem, det oppstår når jeg vil at det skal bli uavgjort. Mer spesifikt når jeg velger "stein" som har variabelen 0 i arrayen. Du kommer sikkert til å forstå det bedre etter du ser på koden:

 

 

public void updatePlayer1(int player, int choice) {
 
        if (player==1) res.spiller1=choice; 
        else if(player==2) res.spiller2=choice;
/*variabler[0] = "Stein";
 *variabler[1] = "Saks";
 *variabler[2] = "Papir"; 
*/
        
        System.out.println(res.spiller1);
        System.out.println(res.spiller2);
       do {
       if (res.spiller1==2&&choice==1) {JOptionPane.showMessageDialog(null, "Spiller 2 har vunnet!");counter2++;}
       if (res.spiller1==0&&choice==2) {JOptionPane.showMessageDialog(null, "Spiller 2 har vunnet!");counter2++;}
       if (res.spiller1==1&&choice==0) {JOptionPane.showMessageDialog(null, "Spiller 2 har vunnet!");counter2++;}
       if (res.spiller1==1&&choice==2) {JOptionPane.showMessageDialog(null, "Spiller 1 har vunnet");counter1++;}
       if (res.spiller1==2&&choice==0) {JOptionPane.showMessageDialog(null, "Spiller 1 har vunnet");counter1++;}
       if (res.spiller1==0&&choice==1) {JOptionPane.showMessageDialog(null, "Spiller 1 har vunnet");counter1++;}
       
       
       
       }while (JOptionPane.showConfirmDialog(null,
         "Klar?\nSpiller 1:" +counter1+"\nSpiller 2: "+ counter2, "klar?", JOptionPane.CANCEL_OPTION)==JOptionPane.NO_OPTION);

som du kan se, så syns jeg det var lett å bestemme hvem som vinner. Problemet er når jeg lager en "if" settning for uavgjort som f.eks "res.spiller1==res.spiller2" og jeg velger stein, blir begge variablene automatisk 0, og dermed står det uavgjort før spiller2 får trykket.

Lenke til kommentar

Du kan sette "spiller1" i Resultater-objektet til -1 eller noe sånt for å indikere at spilleren ikke har trykket ennå, f.eks. Evt. innføre en ekstra variabel for hver spiller av type boolean som sier om spilleren har trykket eller ikke.

Lenke til kommentar

Hvordan lager jeg en "if" setning hvis noen trykker på en knapp? if (knapp1.isPushed)?

 

boolean isPushed = false;

inni actionlistener skriver jeg isPushed = true;

 

Da må jeg nesten gjøre det samme jeg gjorde med å "transportere tallene" ut av ActionListeneren, og det virker litt stress.

Endret av Emsal
Lenke til kommentar

Her er en måte å gjøre ting på :-)

public enum SteinSaksPapir {
  STEIN ("Stein"),
  SAKS  ("Saks"),
  PAPIR ("Papir");

  private final String navn;

  SteinSaksPapir(String navn) {
    this.navn = navn;
  }

  @Override
  public String toString() {
    return navn;
  }

  public boolean vinnerOver(SteinSaksPapir denAndre) {
    switch (this) {
    case STEIN: return denAndre == SAKS;
    case SAKS:  return denAndre == PAPIR;
    case PAPIR: return denAndre == STEIN;
    }
    return false;
  }

}

public class Buttons implements java.awt.event.ActionListener {

  private javax.swing.JFrame frame;
  private javax.swing.JButton[] buttons;

  private SteinSaksPapir[] spillere;

  public Buttons(int antSpillere) {
    if (antSpillere < 2)
      throw new IllegalArgumentException("Antall spillere må være >= 2!");
    buttons = new javax.swing.JButton[antSpillere];
    spillere = new SteinSaksPapir[antSpillere];
    frame = new javax.swing.JFrame("Buttons");
    frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    java.awt.Container contentPane = frame.getContentPane();
    contentPane.setLayout(new java.awt.FlowLayout());
    for (int i = 0; i < buttons.length; i++) {
      buttons[i] = new javax.swing.JButton("Spiller " + (i+1));
      buttons[i].addActionListener(this);
      contentPane.add(buttons[i]);
    }
    frame.pack();
    frame.setVisible(true);
  }

  @Override
  public void actionPerformed(java.awt.event.ActionEvent e) {
    for (int i = 0; i < buttons.length; i++) {
      if (buttons[i] == e.getSource()) {
        spillere[i] = SteinSaksPapir.values()[
            javax.swing.JOptionPane.showOptionDialog(
                null, "Hva skal spiller " + (i+1) + " velge?",
                "Valg spiller " + (i+1), 0, 0, null,
                SteinSaksPapir.values(), SteinSaksPapir.values()[0])];
        break;
      }
    }
    int vinner = -1;
    for (int i = 0; i < spillere.length; i++) {
      if (spillere[i] == null) return;
      vinner = i;
      for (int j = 0; j < spillere.length; j++) {
        if (i == j) continue;
        if (!spillere[i].vinnerOver(spillere[j])) {
          vinner = -1;
          break;
        }
      }
      if (vinner != -1) break;
    }
    javax.swing.JOptionPane.showMessageDialog(
        null, (vinner == -1 ? "Ingen vant!"
        : "Spiller " + (vinner+1) + " vant med " + spillere[vinner] + "!"));
    for (int i = 0; i < spillere.length; i++) {
      spillere[i] = null;
    }
  }

  public static void main(String[] args) {
    final int antSpillere = (args.length > 0 ? Integer.parseInt(args[0]) : 2);
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        Buttons b = new Buttons(antSpillere);
      }
    });
  }

}
Endret av jonny
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...