Hallo,
ich habe wieder ein Problem mit einer GUI..
Es geht wieder um ein Quiz. Das letzte Quiz habe ich (mit Forenhilfe) mit einem CardLayout gelöst. Im Prinzip steht es mir frei, meine derzeitige Lösung ist, dass jedes mal ein neuer FrageFrame erstellt und der alte disposed wird, aber das führt zu einem recht unschönem Ergebnis, weil es dann eben "blinkt", wenn man eine Antwort abgibt. Ich möchte, dass spezielle Komponenten ersetzt werden, wenn ich einen Button drücke, aber es geht nicht.
Die Frage (und die Antworten) bleibt immer gleich, der Rest geht allerdings und man kommt auch auf den ScoreFrame am Ende.
[CODE lang="java" title="Controller"]public class Controller
{
private Spiel spiel;
StartFrame startFrame;
ScoreFrame scoreFrame;
FrageFrame frageFrame;
private int aktuelleFrage=0;
public Controller()
{
spiel = new Spiel();
}
public boolean erhoeheFrage()
{
aktuelleFrage++;
if (aktuelleFrage>=spiel.getFrageListe().size())
return false;
return true;
}
public void erhoeheScore()
{
spiel.getAktiverSpieler().erhoeheScore();
}
//Frame-Anzeige-Methoden
public void zeigeStartFrame()
{
startFrame = new StartFrame(this);
}
public void zeigeScoreFrame()
{
scoreFrame = new ScoreFrame(spiel.getSpielerListe(), this);
frageFrame.dispose();
}
public void zeigeFrageFrame() //Braucht aktuelle Frage
{
frageFrame = new FrageFrame(aktuelleFrage, spiel.getFrageListe(), this);
}
public void setAktuelleFrage(int aktuelleFrage)
{
this.aktuelleFrage = aktuelleFrage;
}
public void aktualisiereFrage()
{
frageFrame.setAktuelleFrage(aktuelleFrage);
frageFrame.repaint();
}
}[/CODE]
[CODE lang="java" title="FrageFrame"]public class FrageFrame extends JFrame
{
int aktuelleFrage;
ArrayList <Frage>frageListe;
private JButton[] buttons;
private JPanel buttonPanel1, buttonPanel2, helpPanel, fragePanel;
private Controller control;
public FrageFrame(int aktuelleFrage, ArrayList <Frage>frageListe, Controller control)
{
this.aktuelleFrage = aktuelleFrage;
this.frageListe = frageListe;
this.control = control;
this.setTitle("Cortility-Quiz");
this.setBounds(0, 0, 600, 350);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel fragePanel = new JPanel();
JLabel frage = setzeLabel(aktuelleFrage);
fragePanel.setBackground(Color.decode("#E0006C"));
fragePanel.add(frage);
//Zufallsbefuellung der Buttons später evtl normale Befuellung und Zufallsverteilung
buttons = buttonsBefuellen();
buttonPanel1 = new JPanel();
buttonPanel2 = new JPanel();
buttonPanel1.add(buttons[0]);
buttonPanel1.add(buttons[1]);
buttonPanel2.add(buttons[2]);
buttonPanel2.add(buttons[3]);
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
this.getContentPane().setBackground(Color.decode("#D1DCE3"));
buttonPanel1.setBackground(Color.decode("#D1DCE3"));
buttonPanel2.setBackground(Color.decode("#D1DCE3"));
this.add(fragePanel);
this.getContentPane().add(Box.createVerticalStrut(30));
this.add(buttonPanel1);
this.add(buttonPanel2);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public JButton[] buttonsBefuellen()
{
JButton[] buttons = new JButton[4];
//FrageButtonListener richtigeAntwortListener = new FrageButtonListener(true, this);
//FrageButtonListener falscheAntwortListener = new FrageButtonListener(false, this);
boolean buttonsLeer = true;
do
{
int leereButtons=4;
for(int i=0; i<3
{
AntwortListener antwortListenerFalse = new AntwortListener(control, false);
Random zufall = new Random();
int buttonWahl = zufall.nextInt(4);
if(buttons[buttonWahl]==null)
{
//Button generieren
buttons[buttonWahl] = new JButton(frageListe.get(aktuelleFrage).getFalscheAntworten(i));
buttons[buttonWahl].setBackground(Color.white);
buttons[buttonWahl].setForeground(Color.decode("#66808d"));
buttons[buttonWahl].setPreferredSize(new Dimension((this.getWidth()-50)/4, this.getHeight()/4));
buttons[buttonWahl].addActionListener(antwortListenerFalse);
leereButtons--;
i++;
}
}
//Sobald drei Buttons befüllt sind, erhält der letzte Button die richtige Antwort.
if(leereButtons == 1)
{
for(int i = 0; i<buttons.length; i++)
{
if(buttons==null)
{
AntwortListener antwortListenerTrue = new AntwortListener(control, true);
buttons = new JButton(frageListe.get(aktuelleFrage).getRichtigeAntwort());
buttons.setBackground(Color.white);
buttons.setForeground(Color.decode("#66808d"));
buttons.setPreferredSize(new Dimension((this.getWidth()-50)/4, this.getHeight()/4));
buttons.addActionListener(antwortListenerTrue);
buttonsLeer = false;
}
}
}
}while(buttonsLeer);
return buttons;
}
public JLabel setzeLabel(int aktuelleFrage)
{
JLabel frage = new JLabel(frageListe.get(aktuelleFrage).getFrage());
frage.setFont(new Font("Serif", 0, 20));
frage.setForeground(Color.WHITE);
return frage;
}
public void setAktuelleFrage(int aktuelleFrage)
{
this.aktuelleFrage = aktuelleFrage;
}
}
[/CODE]
[CODE lang="java" title="Listener für die Buttons"]public class AntwortListener implements ActionListener
{
Controller control;
boolean richtig;
public AntwortListener(Controller control, boolean richtig)
{
this.control = control;
this.richtig = richtig;
}
@Override
public void actionPerformed(ActionEvent arg0)
{
if (richtig)
control.erhoeheScore();
//control.frageFrame.dispose();
if(control.erhoeheFrage())
{
//control.zeigeFrageFrame();
control.aktualisiereFrage();
}
else
control.zeigeScoreFrame();
}
}[/CODE]
ich habe wieder ein Problem mit einer GUI..
Es geht wieder um ein Quiz. Das letzte Quiz habe ich (mit Forenhilfe) mit einem CardLayout gelöst. Im Prinzip steht es mir frei, meine derzeitige Lösung ist, dass jedes mal ein neuer FrageFrame erstellt und der alte disposed wird, aber das führt zu einem recht unschönem Ergebnis, weil es dann eben "blinkt", wenn man eine Antwort abgibt. Ich möchte, dass spezielle Komponenten ersetzt werden, wenn ich einen Button drücke, aber es geht nicht.
Die Frage (und die Antworten) bleibt immer gleich, der Rest geht allerdings und man kommt auch auf den ScoreFrame am Ende.
[CODE lang="java" title="Controller"]public class Controller
{
private Spiel spiel;
StartFrame startFrame;
ScoreFrame scoreFrame;
FrageFrame frageFrame;
private int aktuelleFrage=0;
public Controller()
{
spiel = new Spiel();
}
public boolean erhoeheFrage()
{
aktuelleFrage++;
if (aktuelleFrage>=spiel.getFrageListe().size())
return false;
return true;
}
public void erhoeheScore()
{
spiel.getAktiverSpieler().erhoeheScore();
}
//Frame-Anzeige-Methoden
public void zeigeStartFrame()
{
startFrame = new StartFrame(this);
}
public void zeigeScoreFrame()
{
scoreFrame = new ScoreFrame(spiel.getSpielerListe(), this);
frageFrame.dispose();
}
public void zeigeFrageFrame() //Braucht aktuelle Frage
{
frageFrame = new FrageFrame(aktuelleFrage, spiel.getFrageListe(), this);
}
public void setAktuelleFrage(int aktuelleFrage)
{
this.aktuelleFrage = aktuelleFrage;
}
public void aktualisiereFrage()
{
frageFrame.setAktuelleFrage(aktuelleFrage);
frageFrame.repaint();
}
}[/CODE]
[CODE lang="java" title="FrageFrame"]public class FrageFrame extends JFrame
{
int aktuelleFrage;
ArrayList <Frage>frageListe;
private JButton[] buttons;
private JPanel buttonPanel1, buttonPanel2, helpPanel, fragePanel;
private Controller control;
public FrageFrame(int aktuelleFrage, ArrayList <Frage>frageListe, Controller control)
{
this.aktuelleFrage = aktuelleFrage;
this.frageListe = frageListe;
this.control = control;
this.setTitle("Cortility-Quiz");
this.setBounds(0, 0, 600, 350);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel fragePanel = new JPanel();
JLabel frage = setzeLabel(aktuelleFrage);
fragePanel.setBackground(Color.decode("#E0006C"));
fragePanel.add(frage);
//Zufallsbefuellung der Buttons später evtl normale Befuellung und Zufallsverteilung
buttons = buttonsBefuellen();
buttonPanel1 = new JPanel();
buttonPanel2 = new JPanel();
buttonPanel1.add(buttons[0]);
buttonPanel1.add(buttons[1]);
buttonPanel2.add(buttons[2]);
buttonPanel2.add(buttons[3]);
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
this.getContentPane().setBackground(Color.decode("#D1DCE3"));
buttonPanel1.setBackground(Color.decode("#D1DCE3"));
buttonPanel2.setBackground(Color.decode("#D1DCE3"));
this.add(fragePanel);
this.getContentPane().add(Box.createVerticalStrut(30));
this.add(buttonPanel1);
this.add(buttonPanel2);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public JButton[] buttonsBefuellen()
{
JButton[] buttons = new JButton[4];
//FrageButtonListener richtigeAntwortListener = new FrageButtonListener(true, this);
//FrageButtonListener falscheAntwortListener = new FrageButtonListener(false, this);
boolean buttonsLeer = true;
do
{
int leereButtons=4;
for(int i=0; i<3
{
AntwortListener antwortListenerFalse = new AntwortListener(control, false);
Random zufall = new Random();
int buttonWahl = zufall.nextInt(4);
if(buttons[buttonWahl]==null)
{
//Button generieren
buttons[buttonWahl] = new JButton(frageListe.get(aktuelleFrage).getFalscheAntworten(i));
buttons[buttonWahl].setBackground(Color.white);
buttons[buttonWahl].setForeground(Color.decode("#66808d"));
buttons[buttonWahl].setPreferredSize(new Dimension((this.getWidth()-50)/4, this.getHeight()/4));
buttons[buttonWahl].addActionListener(antwortListenerFalse);
leereButtons--;
i++;
}
}
//Sobald drei Buttons befüllt sind, erhält der letzte Button die richtige Antwort.
if(leereButtons == 1)
{
for(int i = 0; i<buttons.length; i++)
{
if(buttons==null)
{
AntwortListener antwortListenerTrue = new AntwortListener(control, true);
buttons = new JButton(frageListe.get(aktuelleFrage).getRichtigeAntwort());
buttons.setBackground(Color.white);
buttons.setForeground(Color.decode("#66808d"));
buttons.setPreferredSize(new Dimension((this.getWidth()-50)/4, this.getHeight()/4));
buttons.addActionListener(antwortListenerTrue);
buttonsLeer = false;
}
}
}
}while(buttonsLeer);
return buttons;
}
public JLabel setzeLabel(int aktuelleFrage)
{
JLabel frage = new JLabel(frageListe.get(aktuelleFrage).getFrage());
frage.setFont(new Font("Serif", 0, 20));
frage.setForeground(Color.WHITE);
return frage;
}
public void setAktuelleFrage(int aktuelleFrage)
{
this.aktuelleFrage = aktuelleFrage;
}
}
[/CODE]
[CODE lang="java" title="Listener für die Buttons"]public class AntwortListener implements ActionListener
{
Controller control;
boolean richtig;
public AntwortListener(Controller control, boolean richtig)
{
this.control = control;
this.richtig = richtig;
}
@Override
public void actionPerformed(ActionEvent arg0)
{
if (richtig)
control.erhoeheScore();
//control.frageFrame.dispose();
if(control.erhoeheFrage())
{
//control.zeigeFrageFrame();
control.aktualisiereFrage();
}
else
control.zeigeScoreFrame();
}
}[/CODE]