Dieser Code ist ein einfacher Motor für ein Quiz-Spiel. Die Idee ist, dass die Antworten auf den JButtons angezeigt werden. Um dies zu tun, musste ich eine Aktualisierungsmethode einrichten, die alles löscht und neu zeichnet. Es scheint, dass jedes Mal, wenn diese Methode aufgerufen wird, es langsam wird. Es wird so langsam nach ungefähr 10 Knopfklicks, dass es nicht mehr reagiert und ich muss das Programm manuell beenden.Kleine Swing-Anwendung stürzt nach dem Klicken auf Schaltflächen mehrmals
Dank
package mainPackage;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MainGame{
static JFrame frame;
static WindowComp w;
public static void main(String[] args) {
frame = new JFrame("Game");
w = new WindowComp();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
frame.setResizable(true);
WindowComp.setAnswers("start", "start", "start", "start");
WindowComp.refreshAll(w, frame);
WindowComp.setAnswers("final", "final", "final", "final");
WindowComp.refreshAll(w, frame);
}
}
public class WindowComp extends JComponent implements ActionListener {
static JButton [] buttons = new JButton[4];
static JLabel question = new JLabel("default");
public WindowComp(){
setAnswers("default", "default", "default", "default");
}
public void paintComponent(Graphics g){
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == buttons[0]){
setQuestion("button 1");
}
if(e.getSource() == buttons[1]){
setQuestion("button 2");
}
if(e.getSource() == buttons[2]){
setQuestion("button 3");
}
if(e.getSource() == buttons[3]){
setQuestion("button 4");
}
refreshAll(MainGame.w, MainGame.frame);
}
public void addAll(){
setLayout(new FlowLayout());
buttons[0].addActionListener(this);
buttons[1].addActionListener(this);
buttons[2].addActionListener(this);
buttons[3].addActionListener(this);
add(buttons[0]);
add(buttons[1]);
add(buttons[2]);
add(buttons[3]);
add(question);
}
public static void setAnswers(String ans1, String ans2, String ans3,String ans4){
buttons[0] = new JButton("Answer 1 : " + ans1);
buttons[1] = new JButton("Answer 2 : " + ans2);
buttons[2] = new JButton("Answer 3 : " + ans3);
buttons[3] = new JButton("Answer 4 : " + ans4);
}
public static void setQuestion(String q){
question = new JLabel("Question: " + q);
}
public static void refreshAll(WindowComp w, JFrame frame){
w.removeAll();
w.addAll();
w.revalidate();
frame.add(w);
}
}
Warum verwenden Sie nicht [Kartenlayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html) es wurde gemacht, so dass Sie nicht entfernen müssen -> hinzufügen -> revalidate sich selbst. Probieren Sie es aus – Frakcool
@krzyk (in der Hoffnung, dass Sie das sehen werden): Dies könnte die richtige Antwort gewesen sein. Erwähnenswert ist hier zumindest: Bei jedem Aufruf von 'refreshAll' fügen Sie den Schaltflächen Aktions-Listener hinzu. Nach ein paar Klicks haben die Schaltflächen Dutzende von Aktionshörern. Das könnte die Sache etwas durcheinander bringen. Ungeachtet dessen ist der Gesamtansatz nicht der beste, und Sie sollten z.B. ein 'CardLayout', wie Frakcool vorgeschlagen hat. – Marco13
Die Anzahl der Listener wächst exponentiell. Ich habe es gerade ausprobiert. – mszymborski