Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Sep 2009

Utveckla ett GUI

Hej!

Är ganska ny på java programmering, och försöker göra ett enkelt gui till ett kortspel.

Det jag inte får till är hur jag gör för att få två (eller flera) knappar bredvid varandra.

Detta är fönstret, (och programmet är inte färdigt ännu...)

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; import java.text.*; public class Fonster3 extends JFrame { private JTextArea textruta; public static void main(String[] args) { Fonster3 fönster = new Fonster3(); fönster.show(); } public Fonster3() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 400); setLocation(100, 100); setTitle("21!"); Panel buttonPanel = new Panel(); JButton knapp = new JButton("Dra"); JButton knapp2 = new JButton("Stanna"); textruta = new JTextArea(); Container innehåll = getContentPane(); innehåll.setLayout(null); innehåll.add(knapp); innehåll.add(knapp2); innehåll.add(textruta); textruta.setBounds(20, 20, 250, 250); knapp.setBounds(15, 290, 150, 40); knapp2.setBounds(20, 290, 150, 40); KnappLyssnare lyssnare = new KnappLyssnare(this); knapp.addActionListener(lyssnare); } public void knappKlickad() { textruta.setText ("Du fick..."); } } class KnappLyssnare implements ActionListener { Fonster3 fönster; public KnappLyssnare(Fonster3 fönster) { this.fönster = fönster; } public void actionPerformed(ActionEvent händelse) { fönster.knappKlickad(); } }

Tacksam för all hjälp!

Trädvy Permalänk
Medlem
Registrerad
Okt 2003

vad är det med alla dessa kortspel och java den senaste tiden... ? ^^

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Okt 2004

Du måste ha en Layout manager på containern som du lägger till GUI komponenter till. Enligt din kod har du satt den till null.

Kolla här för att välja en som passar för din layout.
http://java.sun.com/docs/books/tutorial/uiswing/layout/visual...

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Sep 2009

Tack för hjälpen!!

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008
Citat:

Ursprungligen inskrivet av Racy
Du måste ha en Layout manager på containern som du lägger till GUI komponenter till. Enligt din kod har du satt den till null.

Man "måste" inte alls ha en layout manager. Sätter man den till null så tillämpas absolut positionering, vilket innebär att man själv måste ange storlek och position på varje komponent man lägger i containern.

Det kan däremot vara både praktiskt och bekvämt med automatisk layouthantering...

Diomedes: Anledningen till att dina knappar hamnade "på varandra" var helt enkelt att du inte gav knapp2 en x-koordinat tillräckligt långt åt höger i setBounds-anropet. T.ex. hade

knapp2.setBounds(180, 290, 150, 40);

funkat något bättre.

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Sep 2009

Det var det jag misstänkte, men jag lyckades ändå inte få fram den. Nu har jag lagt till en layout manager i alla fall. Var lite enklare på den nivå jag är på.

Tack för svaret i alla fall!

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Okt 2004
Citat:

Ursprungligen inskrivet av badboll
Man "måste" inte alls ha en layout manager. Sätter man den till null så tillämpas absolut positionering, vilket innebär att man själv måste ange storlek och position på varje komponent man lägger i containern.

Så klart man inte "måste", kanske var dumt ordval, men man blir ju tokig om man ska sätta absoluta koordinater på allt

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Okt 2004

Du lägger till listeners i GUI komponenterna. Listeners är callbacks kan man säga. När någon trycker på en knapp så anropas t.ex alla ActionListener:s som lyssnar på knappen.

Exempel:

button.addActionListener(actionListenerObjekt);

Eller med anonym inre klass som listener

button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { /* Kod som gör något. */ } });

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Testa att sätta layouten på panelen istället för framen.

JFrame frame = new JFrame("Foobar!"); Container cp = frame.getContentPane(); // hämtar default container som skapas i samband med new JFrame() cp.setLayout(new BoxLayout(cp, BoxLayout.Y_AXIS)); JLabel label = new JLabel("foo"); JButton button = new JButton("bar"); cp.add(label); cp.add(button);

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Sep 2009

Tack för hjälpen!!

Undrar en sak till, det jag skapat i fönstret (knappar etc) syns bara ibland när jag kör programmet, resten av gångerna är fönstret tomt, hur kommer det sig??

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Citat:

Ursprungligen inskrivet av Diomedes
Tack för hjälpen!!

Undrar en sak till, det jag skapat i fönstret (knappar etc) syns bara ibland när jag kör programmet, resten av gångerna är fönstret tomt, hur kommer det sig??

Har du kört en frame.pack(); efter det att du lagt till alla widgets?

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Sep 2009

nej, det känner jag inte igen, lägger jag till det direkt efter det jag skapar i fönstret?

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Ja precis. Det gör så att fönstrets storlek anpassas efter dess innehåll / preferred size osv. Packar framen helt enkelt (och gör allting synligt). referens

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Sep 2009

Layout-fråga

Jag har uppenbarligen missförstått något med layoutmanager, men vad?? Hur jag än ändrar blir designen ful, knapparna till höger och textarean till vänster, och det blir ingen "ram"...

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Frame extends JFrame implements ActionListener { JButton hit; JButton stay; JButton exit; JTextArea txt; KortBunt lek; Manniska du; Dator jag; public Frame() { setTitle("Test"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); hit = new JButton("Hit"); stay = new JButton("Stay"); exit = new JButton("Exit"); txt = new JTextArea(20,20); hit.addActionListener(this); stay.addActionListener(this); exit.addActionListener(this); Container c = getContentPane(); c.setLayout(new BorderLayout()); JPanel window = new JPanel(); window.setLayout(new BoxLayout(window, BoxLayout.X_AXIS)); window.add(hit); window.add(stay); window.add(exit); window.add(txt); c.add(window, BorderLayout.CENTER); lek = new KortBunt(); du = new Manniska(lek); jag = new Dator(lek, du); lek.nyKortlek(); lek.blanda(); du.nyttSpel(); du.nyttKort(); txt.append("Du har korten: "+du.symboler+" och har "+du.p+" poäng\n"); setVisible(true); } public void actionPerformed(ActionEvent e) { if (hit == e.getSource()) { if(du.p<21) { du.nyttKort(); txt.append("Du har korten: "+du.symboler+" och har "+du.p+" poäng\n"); if(du.p>21) { txt.append("Du förlorade...\n"); } else if(du.p == 21) { txt.append("Du vann!!\n"); } } } else if (stay == e.getSource()) { if(du.p != 21) { jag.nyttSpel(); txt.append("Dealerns tur...\n"); while(jag.p<=21 && jag.p<=du.p) { jag.nyttKort(); } txt.append("Datorn fick korten:" + jag.symboler + " och har "+jag.p+" poäng\n"); if (jag.poäng() <= 21 && jag.poäng() >= du.poäng()) { txt.append("Du förlorade!\n"); } else { txt.append("Du vann!\n"); } } } else if (exit == e.getSource()) { System.exit(0); } } public static void main(String[] args) { new Frame(); } }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008

Hur vill du ha layouten? Skissa i mspaint eller nåt så kan jag nog hjälpa dig.

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Sep 2009

vet inte riktigt hur jag får upp en skiss här...
men jag skulle vilja ha textarean centrerad o knapparna under om det säger någonting...

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008

T.ex. så här?

public Frame() { // ... setLayout(new BorderLayout()); add(txt, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); buttonPanel.add(hit); buttonPanel.add(stay); buttonPanel.add(exit); add(buttonPanel, BorderLayout.SOUTH); }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Mar 2008

Det ger sig efter ett tag, kan jag säga. Jag skrev t.ex. ovanstående inlägg utan att först testa om koden ens skulle kompilera, än mindre om det såg rätt ut...

Trädvy Permalänk
Medlem
Registrerad
Okt 2003

Men nu får det väll ändå räcka med alla trådar om kortspel i java med gui!?

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Trädvy Permalänk
Medlem
Plats
Bromma
Registrerad
Aug 2008
Citat:

Ursprungligen inskrivet av E_maN
Men nu får det väll ändå räcka med alla trådar om kortspel i java med gui!?

Kanske nån skola som har det som uppgift ^^

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Trädvy Permalänk
Medlem
Registrerad
Okt 2003
Citat:

Ursprungligen inskrivet av KurreKula
Kanske nån skola som har det som uppgift ^^

jo säkerligen men
http://www.sweclockers.com/forum/showthread.php?s=&postid=948...
http://www.sweclockers.com/forum/showthread.php?s=&postid=948...

han behöver väll inte göra ytliggare en tråd? samt att han borde fråga läraren mer istället för att fråga massa frågor på forumet tycker jag, alltid lättare att få det förklarat för sig, om det nu är en skoluppgift vilket jag antar

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Trädvy Permalänk
Medlem
Registrerad
Jul 2006

Med tanke på att Kortspelsexemplet finns med i boken "Java Direkt med Swing" gissar jag att det säkerligen finns en uppgift att skapa ett gui till detta spel

Trädvy Permalänk
Medlem
Plats
Sverige
Registrerad
Sep 2009

Helt rätt, exemplet finns med i den boken, men uppgiften är ett eget val.
Pluggar man på distans går det inte alltid så snabbt att få svar, därför verkade det som att ett forum var ett bra alternativ.

Jag letar inte efter färdiga svar, bara lite tips.

Vad gäller att skapa flera trådar så är detta nytt för mig och jag vet inte hur allt fungerar.

Trädvy Permalänk
Forumledare
Plats
Jönköping
Registrerad
Jun 2004

Du hade skapat väldigt många trådar om det här ämnet. Eftersom man bör hålla sig till en tråd, har jag slagit ihop alla dina trådar.

*trådar sammanfogade*

Kontakta mig direkt vid frågor om eller synpunkter på modereringen/forumet och glöm inte att tala om vilken tråd det handlar om. Kontaktvägar: albert@sweclockers.com, kontaktformuläret och moderatorernas gemensamma pm-konto. Annat användbart: regler och feedbackforumet. Funderar du på att anmäla ett inlägg? Tveka inte! Gör det även om du är osäker. Det är vår sak att bedöma det, inte din.