Permalänk
Medlem

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!

Permalänk
Medlem

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

Visa signatur

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 :)

Permalänk
Medlem

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...

Permalänk
Medlem

Tack för hjälpen!!

Permalänk
Medlem
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.

Permalänk
Medlem

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!

Permalänk
Medlem
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

Permalänk
Medlem

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. */ } });

Permalänk
Medlem

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);

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

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??

Permalänk
Medlem
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?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

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

Permalänk
Medlem

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

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

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(); } }

Permalänk
Medlem

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

Permalänk
Medlem

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...

Permalänk
Medlem

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); }

Permalänk
Medlem

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...

Permalänk
Medlem

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

Visa signatur

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 :)

Permalänk
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 ^^

Visa signatur

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

Permalänk
Medlem
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

Visa signatur

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 :)

Permalänk
Medlem

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

Permalänk
Medlem

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.

Permalänk
Hedersmedlem

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*