AWT Einzelne Komponenten zur Laufzeit austauschen?

PinkMuffin

Bekanntes Mitglied
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]
 

PinkMuffin

Bekanntes Mitglied
EDIT:
Ich hab jetzt ein bisschen rumgebastelt und wenn ich folgendes in den FrageFrame einbaue,

Java:
    public void neuZeichnen()
    {
        this.remove(fragePanel);
        this.remove(buttonPanel1);
        this.remove(buttonPanel2);
       
        fragePanel = setzeFragePanel(); // ist das gleiche, wie vorher setze Label, nur wird hier gleich das ganze Panel erzeugt
       
        buttonPanel1.remove(buttons[0]);
        buttonPanel1.remove(buttons[1]);
        buttonPanel2.remove(buttons[2]);
        buttonPanel2.remove(buttons[3]);
        buttons = buttonsBefuellen();
        buttonPanel1.add(buttons[0]);
        buttonPanel1.add(buttons[1]);
        buttonPanel2.add(buttons[2]);
        buttonPanel2.add(buttons[3]);
       
        this.add(fragePanel);
        this.add(buttonPanel1);
        this.add(buttonPanel2);
       
        this.repaint();
    }

dann ändert sich was am FrageFrame, allerdings wird das adden der Elemente komplett ignoriert. (Oder zumindest nicht so ausgeführt, wie ich das gedacht hätte. Der erste Frame ist noch richtig, aber der zweite ist dann komplett leer. Ich hab spaßeshalber mal das remove weggelassen, dann bleibt mein FragePanel mit der Frage unverändert stehen (obwohl es sich verändern sollte) und die Buttons fehlen aber trotzdem..
 
K

kneitzel

Gast
Wenn das Layout selbst bleibt:: Wieso änderst Du denn dann nicht einfach nur den Text der Buttons und so? Immer alles neu aufbauen ist recht umständlich und so doch auch nicht notwendig.
 

PinkMuffin

Bekanntes Mitglied
Wenn das Layout selbst bleibt:: Wieso änderst Du denn dann nicht einfach nur den Text der Buttons und so? Immer alles neu aufbauen ist recht umständlich und so doch auch nicht notwendig.
Ja, vermutlich fast schon ein Beispiel für Overengineering, ich hab mir das alles durch die umständliche Zufallsgenerierung komplizierter gemacht, als es eigentlich war (weil ja zwei verschiedene Listener gebraucht wurden) 😅
vielen Dank für den Tipp, jetzt funktioniert alles :D
Manchmal bin ich ein Idiot. Ich schiebe die Änderung der Buttongenerierung jetzt schon Stunden vor mir her, weil ich mir die Arbeit sparen wollte, dabei hat es nicht mal 10 Minuten gedauert und alles andere einfacher gemacht

Falls jemand ein ähnliches Problem hat:
Die zufällige Verteilung von Buttons lässt sich so relativ gut lösen:
[CODE lang="java" title="Zufallsverteilung von Buttons"]import java.awt.GridLayout;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ButtonFrame extends JFrame
{
private JButton[] buttons;
private JPanel buttonPanel;


public ButtonFrame()
{
this.setTitle("Title");
this.setBounds(0, 0, 600, 350);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);

buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(2,2));
buttonsBefuellen();
buttonsZuordnen();
this.add(buttonPanel);
this.setLocationRelativeTo(null);
this.setVisible(true);
}

public void buttonsBefuellen()
{
buttons = new JButton[4];
ButtonListener listenerFalsch = new ButtonListener();
ButtonListener listenerRichtig = new ButtonListener();
for(int i=0; i<3; i++)
{
buttons = new JButton("falsche Antwort");
buttons.addActionListener(listenerFalsch);
}
buttons[3]= new JButton("richtige Antwort");
buttons[3].addActionListener(listenerRichtig);

}

public void buttonsZuordnen()
{
int buttonsVerteilt = 0;
Random zufall = new Random();
do
{
int buttonWahl = zufall.nextInt(4);
if(buttons[buttonWahl]!= null)
{
buttonPanel.add(buttons[buttonWahl]);
buttons[buttonWahl]=null;
buttonsVerteilt++;
}

}while(buttonsVerteilt!=4);


}

}[/CODE]

Und die Methode, die dann den Frame neu schreibt, sieht jetzt so aus:
Java:
    public void neuZeichnen()
    {
        frage.setText(frageListe.get(aktuelleFrage).getFrage());
        buttonPanel.removeAll();
       
        buttonsBefuellen();
        buttonsZuordnen();

        this.repaint();
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
J JavaFX TabPane / Wie füge ich einzelne items ? AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
N jFreeChart einzelne Punkte anwählen und Formatieren AWT, Swing, JavaFX & SWT 0
M JavaFX TextArea einzelne Buchstaben färben AWT, Swing, JavaFX & SWT 3
T Swing Einzelne Teile eines Textes färben? AWT, Swing, JavaFX & SWT 10
M Einzelne Ordner im JFileChooser ausgrauen? AWT, Swing, JavaFX & SWT 4
D Swing Mit TableCellRenderer einzelne Zellen markieren AWT, Swing, JavaFX & SWT 3
R einzelne Zeichen in jTable einlesen AWT, Swing, JavaFX & SWT 10
M Swing Einzelne Fenster schließen AWT, Swing, JavaFX & SWT 2
V JTable: Zugriff auf einzelne Zellen AWT, Swing, JavaFX & SWT 4
K Swing CellEditor für einzelne Zellen AWT, Swing, JavaFX & SWT 2
K Swing JTable Editierfunktion für einzelne Zellen ausschalten AWT, Swing, JavaFX & SWT 3
S Einzelne JComboBox in JTable austauschen AWT, Swing, JavaFX & SWT 4
F Einzelne TreeNode an einem JTree editierbar machen AWT, Swing, JavaFX & SWT 3
C JTree Einzelne Objekte färben AWT, Swing, JavaFX & SWT 4
C Spielfeld Gitter - Einzelne Zellen verändern AWT, Swing, JavaFX & SWT 18
J CellRenderer einzelne zellen Hintergrund AWT, Swing, JavaFX & SWT 9
B Swing Einzelne Zelle in JTable soll NICHT auswählbar sein AWT, Swing, JavaFX & SWT 9
M JTable einzelne Zeilen färben AWT, Swing, JavaFX & SWT 2
A Swing JTree Editable einzelne Nodes editierbar machen! AWT, Swing, JavaFX & SWT 2
T einzelne Zelle einer JTable auswählen und Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 2
T JTable - Einzelne Spalte nicht sortieren? AWT, Swing, JavaFX & SWT 2
R JTable einzelne Zellen selektieren AWT, Swing, JavaFX & SWT 7
H Einzelne Pixel auf Transparenz überprüfen? AWT, Swing, JavaFX & SWT 3
J JTable: Einzelne Zelle selektieren AWT, Swing, JavaFX & SWT 6
X Einzelne Border setzen AWT, Swing, JavaFX & SWT 2
F png-Datei erstellen und einzelne Pixel schreiben AWT, Swing, JavaFX & SWT 2
J MVC- einzelne Sichten auf einer Hauptsicht anzeigen AWT, Swing, JavaFX & SWT 3
S Einzelne Frame Fenster schließen AWT, Swing, JavaFX & SWT 2
S Einzelne Frame Fenster schließen AWT, Swing, JavaFX & SWT 2
P JTextArea - einzelne Zeile löschen bzw einfügn AWT, Swing, JavaFX & SWT 2
G Einzelne Objekte neu zeichnen AWT, Swing, JavaFX & SWT 8
B einzelne Zellen scrollbar machen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 3
E JTable einzelne reihe editierbar machen AWT, Swing, JavaFX & SWT 2
I einzelne Zellen bei JTable markieren AWT, Swing, JavaFX & SWT 3
C JTable: Einzelne Spalten nicht editierbar machen AWT, Swing, JavaFX & SWT 2
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
BabySuna Swing Komponenten auslagern auf separate Datei AWT, Swing, JavaFX & SWT 8
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
F Gebundene Eigenschaften bei Komponenten mit NetBeans verarbeiten AWT, Swing, JavaFX & SWT 3
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
P Gleichmäßige Anodnung von Komponenten im migLayout AWT, Swing, JavaFX & SWT 2
DaCrazyJavaExpert Swing Komponenten genauer anordnen. AWT, Swing, JavaFX & SWT 13
DaCrazyJavaExpert Swing Komponenten in GridBagLayout werden Falsch angeordnet AWT, Swing, JavaFX & SWT 1
P Größe und Ausrichtung von Komponenten festlegen AWT, Swing, JavaFX & SWT 13
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
Neumi5694 LookAndFeel Look & Feel nicht angezeigter Komponenten ändern AWT, Swing, JavaFX & SWT 6
D JavaFX GUI Komponenten werden langsam bei größerer Datenmenge AWT, Swing, JavaFX & SWT 6
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX Welche Komponenten vermisst ihr? Welche wären essenziell notwendig? AWT, Swing, JavaFX & SWT 8
M Datei mit Komponenten einbinden AWT, Swing, JavaFX & SWT 7
T SWT Externer zugrif auf SWT Komponenten AWT, Swing, JavaFX & SWT 3
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
J MouseOver bei Komponenten AWT, Swing, JavaFX & SWT 9
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
G Komponenten vergrößern sich nicht trotz Layoutmanager AWT, Swing, JavaFX & SWT 24
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
S BoxLayout: Anordnung der Komponenten links statt zentriert AWT, Swing, JavaFX & SWT 0
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
G Applet Applet Komponenten flackern AWT, Swing, JavaFX & SWT 10
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
M Komponenten übereinander AWT, Swing, JavaFX & SWT 7
R Komponenten werden erst nach maximierung des Frames sichtbar (Linux) AWT, Swing, JavaFX & SWT 5
H Swing Getter für GUI-Komponenten AWT, Swing, JavaFX & SWT 3
B Komponenten in Fenster verdrängen sich untereinander AWT, Swing, JavaFX & SWT 6
N Komponenten übereinander AWT, Swing, JavaFX & SWT 3
S Anordnung von GUI-Komponenten mit LayouManger (Problem beim anzeigen von JTextField) AWT, Swing, JavaFX & SWT 5
M Swing Komponenten enablen? AWT, Swing, JavaFX & SWT 4
X Java Komponenten jeder Zeit hinzufügen können AWT, Swing, JavaFX & SWT 3
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
D Grafische Komponenten komplett neu aufbauen (Neukonstruktion) AWT, Swing, JavaFX & SWT 5
A AWT Komponenten in JavaFX einbetten AWT, Swing, JavaFX & SWT 9
M Swing Komponenten erscheinen beim darüberfahren? AWT, Swing, JavaFX & SWT 7
H Komponenten unmittelbar nach dem Ausführen teilweise unsichtbar AWT, Swing, JavaFX & SWT 3
K GUI in Komponenten aufteilen (MVC) AWT, Swing, JavaFX & SWT 2
W Funktionen, sowie aufruf einiger Komponenten AWT, Swing, JavaFX & SWT 4
J Alle Komponenten eines JFrames durchlaufen AWT, Swing, JavaFX & SWT 2
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben