Emsal Skrevet 21. oktober 2013 Del Skrevet 21. oktober 2013 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
Djn Skrevet 21. oktober 2013 Del Skrevet 21. oktober 2013 (endret) 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 21. oktober 2013 av Djn Lenke til kommentar
Emsal Skrevet 21. oktober 2013 Forfatter Del Skrevet 21. oktober 2013 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
Djn Skrevet 21. oktober 2013 Del Skrevet 21. oktober 2013 (endret) 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 21. oktober 2013 av Djn Lenke til kommentar
Emsal Skrevet 21. oktober 2013 Forfatter Del Skrevet 21. oktober 2013 (endret) 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 21. oktober 2013 av Emsal Lenke til kommentar
Emsal Skrevet 21. oktober 2013 Forfatter Del Skrevet 21. oktober 2013 (endret) 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 21. oktober 2013 av Emsal Lenke til kommentar
Djn Skrevet 22. oktober 2013 Del Skrevet 22. oktober 2013 (endret) 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 22. oktober 2013 av Djn 1 Lenke til kommentar
Emsal Skrevet 22. oktober 2013 Forfatter Del Skrevet 22. oktober 2013 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
Djn Skrevet 22. oktober 2013 Del Skrevet 22. oktober 2013 Hva ønsker du å oppnå med det? De blir lagret individuelt (som res.spiller1 og res.spiller2), og "choice" er bare et argument inne i funksjonen. Lenke til kommentar
Emsal Skrevet 22. oktober 2013 Forfatter Del Skrevet 22. oktober 2013 Ahhaaa Takk, nå skjønner jeg det. Lenke til kommentar
Emsal Skrevet 22. oktober 2013 Forfatter Del Skrevet 22. oktober 2013 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
jonny Skrevet 23. oktober 2013 Del Skrevet 23. oktober 2013 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
Emsal Skrevet 23. oktober 2013 Forfatter Del Skrevet 23. oktober 2013 (endret) 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 23. oktober 2013 av Emsal Lenke til kommentar
Sutekh Skrevet 23. oktober 2013 Del Skrevet 23. oktober 2013 Jeg kjenner jeg får vondt i sjelen av å se klassevariable deklarert som "public". Lenke til kommentar
jonny Skrevet 23. oktober 2013 Del Skrevet 23. oktober 2013 (endret) 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 23. oktober 2013 av jonny Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå