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

Ny JFrame

Försöker göra en liten quiz, där jag vill att ett nytt fönster ska öppnas varje gång användaren svarar, men i min JTextArea ligger frågan från föregående fönster kvar när nästa öppnas, begriper inte hur jag ska göra. Och finns det något enkelt sätt att göra så att nya frågor öppnas i "samma" fönster?

Sedan undrar jag hur jag kan göra om jag vill att frågorna ska skrivas ut utan en textarea, alltså direkt i fönstret? Försökte med en JPanel, men fick inte till det så bra.
Här är programmet, och det är långt ifrån färdigt, och jag är ganska färsk, så ha överseende.

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Quiz extends JFrame implements ActionListener { JButton ja; JButton nej; JButton avsluta; JLabel label; JTextArea txt; public Quiz() { setTitle("Quiz"); setSize(300,300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ja = new JButton("Ja"); nej = new JButton("Nej"); avsluta = new JButton("Avsluta"); label = new JLabel(); txt = new JTextArea(30,30); ja.addActionListener(this); nej.addActionListener(this); avsluta.addActionListener(this); Container c = getContentPane(); setLayout(new BorderLayout()); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); buttonPanel.add(ja); buttonPanel.add(nej); buttonPanel.add(avsluta); add(buttonPanel, BorderLayout.SOUTH); add(label); add(txt, BorderLayout.CENTER); JOptionPane.showMessageDialog(null, "VÄLKOMMEN!"); txt.append("Fråga 1"); setVisible(true); } public void actionPerformed(ActionEvent e) { if(ja == e.getSource()) { JFrame frame2 = new JFrame("Quiz"); txt.append("Fråga 2"); JRadioButton ja = new JRadioButton("Ja"); frame2.setVisible(true); frame2.setSize(200,200); frame2.add(txt); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); buttonPanel.add(ja); buttonPanel.add(nej); buttonPanel.add(avsluta); frame2.add(buttonPanel, BorderLayout.SOUTH); } else if(nej == e.getSource()) { txt.append("Du vann!!\n"); } else if (avsluta == e.getSource()) { System.exit(0); } } public static void main(String[] args) { new Quiz(); } }

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Dec 2003
Citat:

Ursprungligen inskrivet av coka
Försöker göra en liten quiz, där jag vill att ett nytt fönster ska öppnas varje gång användaren svarar, men i min JTextArea ligger frågan från föregående fönster kvar när nästa öppnas, begriper inte hur jag ska göra. Och finns det något enkelt sätt att göra så att nya frågor öppnas i "samma" fönster?

Sedan undrar jag hur jag kan göra om jag vill att frågorna ska skrivas ut utan en textarea, alltså direkt i fönstret? Försökte med en JPanel, men fick inte till det så bra.
Här är programmet, och det är långt ifrån färdigt, och jag är ganska färsk, så ha överseende.

Jag hade så tråkigt så jag slängde ihop något enkelt:

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; public class Quiz extends JFrame implements ActionListener { JButton ja; JButton nej; JButton avsluta; JLabel label; JTextArea txt; ArrayList<String> fragor = new ArrayList<String>(); ArrayList<Integer> svar = new ArrayList<Integer>(); int counter = -1; public Quiz() { setTitle("Quiz"); setSize(300, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ja = new JButton("Ja"); nej = new JButton("Nej"); avsluta = new JButton("Avsluta"); label = new JLabel(); txt = new JTextArea(30, 30); ja.addActionListener(this); nej.addActionListener(this); avsluta.addActionListener(this); Container c = getContentPane(); setLayout(new BorderLayout()); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); buttonPanel.add(ja); buttonPanel.add(nej); buttonPanel.add(avsluta); add(buttonPanel, BorderLayout.SOUTH); add(label); add(txt, BorderLayout.CENTER); JOptionPane.showMessageDialog(null, "VÄLKOMMEN!"); setVisible(true); startQuiz(); } private void startQuiz() { fragor.add("Fråga 1 - Är jag snygg?"); fragor.add("Fråga 2 - Är jag smart?"); fragor.add("Fråga 3 - Är jag stark?"); nextQuestion(); } private void nextQuestion() { counter++; if (fragor.size() == counter) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < fragor.size(); i++) { String dittsvar = ""; if (svar.get(i) == 1) { dittsvar = "Ja"; } else { dittsvar = "Nej"; } sb.append(fragor.get(i) + " Ditt svar: " + dittsvar + "\n"); } JOptionPane.showMessageDialog(null, sb); System.exit(0); } else { txt.setText(fragor.get(counter)); } } public void actionPerformed(ActionEvent e) { if (ja == e.getSource()) { svar.add(counter, 1); } else if (nej == e.getSource()) { svar.add(counter, 0); } else if (avsluta == e.getSource()) { System.exit(0); } nextQuestion(); } public static void main(String[] args) { new Quiz(); } }

Jag förstår inte hur du menar att du vill skriva texten utan en textarea. Du måste ha någon slags kontroller som håller i texten. Menar du JLabel kanske? Går ju att rita ut text men jag tror inte det är det du vill göra.

ηλί, ηλί, λαμά σαβαχθανί!?

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

Tack för hjälpen! Men hur gör jag om jag vill ändra knapparna från fråga till fråga? T.ex första frågan, Ja-Nej knapp, andra frågan, radiobuttons med altrenativ osv?

Trädvy Permalänk
Medlem
Plats
Falun
Registrerad
Dec 2003
Citat:

Ursprungligen inskrivet av coka
Tack för hjälpen! Men hur gör jag om jag vill ändra knapparna från fråga till fråga? T.ex första frågan, Ja-Nej knapp, andra frågan, radiobuttons med altrenativ osv?

Det är lite mer komplext än vad man kan tro. Det är väldigt dynamiskt men då krävs det en dynamisk struktur. På något vis så måste du hålla i olika (exempelvis) paneler som har dina knappar som presenteras för olika frågor. Du måste även ha en riktigt bra actionListener som klarar av att lyssna på alla kontrollers. Eventuellt att du har en egen actionListener för varje panel som sen sparar undan värdet från svaret.

ηλί, ηλί, λαμά σαβαχθανί!?

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

Hade hoppats att det skulle vara lite enklare, det blir inte så snyggt med ett nytt fönster för varje fråga, har dock inte jobbat med GUI särskilt länge, så kunskapsnivån ligger inte så högt ännu