이 코드는 퀴즈 게임을위한 간단한 엔진입니다. 아이디어는 답변이 JButton에 표시된다는 것입니다. 이렇게하려면 모든 것을 삭제하고 다시 칠하는 새로 고침 메서드를 설치해야했습니다. 이 메서드가 호출 될 때마다 점점 느려지는 것 같습니다. 약 10 번의 버튼 클릭 후에 응답이 느려지고 프로그램을 수동으로 종료해야하므로 속도가 느려집니다.단추를 여러 번 클릭하면 작은 스윙 응용 프로그램이 충돌 함
감사
는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);
}
}
[카드 레이아웃] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)을 사용하지 않는 이유는 제거 할 필요가 없기 때문입니다. -> 추가 -> 자신의 재확인. 시도해보십시오 – Frakcool
@krzyk (당신이 이것을 볼 수 있기를 바랍니다) : 이것은 올바른 대답이었을 것입니다. 여기서 최소한 언급 할 가치가 있습니다 :'refreshAll'를 호출 할 때마다 액션 리스너를 버튼에 추가 할 수 있습니다. 몇 번의 클릭 후 버튼에는 수십 개의 액션 리스너가 있습니다. Ths는 약간 물건을 망칠 수 있습니다. 그럼에도 불구하고 전반적인 접근 방식이 최선이 아니므로 고려해야합니다. Frakcool이 제안한대로'CardLayout'을 제안했습니다. – Marco13
청취자의 수가 기하 급수적으로 증가합니다. 방금 해봤 어. – mszymborski