我正在研究一個需要在主要的JFrame
和JPanel
之間進行通信的小遊戲gamepan
。改進JFrame和JPanel之間的通信
遊戲要求用戶通過點擊包含字母表的按鈕找到隱藏的單詞。
我JFrame
包含gamepan
,scorepan
,menus
和其他的東西......
我gamepan
包含我buttonsArrayListener
,隱藏文字和其他東西......
的問題是,當用戶發現隱藏的話我要告訴我的JFrame
,他這樣做稍後可以重新繪製gamepan
,使一個新詞....
我所做的是:我爲m增加了boolean
Ÿgamepan
如果我的話被發現或不和MouseListener
我gamepan
,所以每次我移動鼠標JFrame
測試如果單詞或發現不 然後在我gamepan
,我從JFrame
使用初始化的東西補充制定者告訴再次如果找到隱藏的詞。
我覺得這不是檸有效添加MouseListener
,因爲我必須mouve鼠標來進行的變化,每次鼠標移動沒用treatements由...
我想知道是否有是比添加MouseListener
更好的溶劑?而且我想知道如果我還是很好地爲gamepan
添加setter以設置新詞的變量。
這裏是我的代碼
gamepan代碼
public class GamePanel extends JPanel{
private JPanel leftPan = new JPanel();
private JPanel rightPan = new JPanel();
private String[] letters = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",};
private JButton Button[] = new JButton[26];
private JLabel label1;
private JLabel label2;
private JLabel label3;
private ActionListener buttonListener;
private JOptionPane jop = new JOptionPane();
private Word randWord = new Word(); // mot aléatoire
private TreatedWord tWord = new TreatedWord(randWord.getRandWord());// mot aléatoire traité (etoiles et tout ça)
private char clickedButton;// lettre tappée
private boolean motTrouvé = false; // pour informer la classe Fenetre si le mot a été retrouvé ou pas on utilise ce boolean avec son getter et setter (a savoir que cette classe est informée si le mot est trouvé ou pas via l'objet tWord)
private final List<CustomListener> customListener = new LinkedList<>(); //On crée une liste de CustomListener pour en ajouter autant qu'on veut(Via addCustomListener)
public GamePanel(){
this.setBackground(Color.white);
initGamePan();
initListeners();
this.setLayout(new BorderLayout());
this.add(leftPan,BorderLayout.WEST);
this.add(rightPan,BorderLayout.EAST);
}
public void initGamePan(){
rightPan.add(new JLabel(new ImageIcon("131869.jpg")));
label1 = new JLabel("Nombre de mots trouvés : 0");
label1.setHorizontalAlignment(JLabel.CENTER);
label1.setFont(new Font("arial",Font.BOLD,20));
label1.setPreferredSize(new Dimension(300,50));
label2 = new JLabel("Score Actuel : 0 point");
label2.setHorizontalAlignment(JLabel.CENTER);
label2.setFont(new Font("arial",Font.BOLD,20));
label2.setPreferredSize(new Dimension(300,50));
label3 = new JLabel(tWord.getStars());
label3.setHorizontalAlignment(JLabel.CENTER);
label3.setFont(new Font("arial",Font.BOLD,30));
label3.setForeground(Color.blue);
label3.setPreferredSize(new Dimension(450,50));
leftPan.add(label1);
leftPan.add(label2);
leftPan.add(label3);
for(int i=0;i<letters.length;i++){
Button[i]= new JButton(letters[i]);
leftPan.add(Button[i]);
}
leftPan.setPreferredSize(new Dimension(460,650));
leftPan.setBackground(Color.WHITE);
rightPan.setPreferredSize(new Dimension(420,650));
rightPan.setBackground(Color.WHITE);
}
public void initListeners(){
buttonListener= new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
clickedButton = ((JButton)(arg0.getSource())).getText().charAt(0); // on prend le bouton cliqué, on le convertis en string puis en char
label3.setText(tWord.treatedWord(clickedButton));// on donne a la methode tretedWord de l'objet tWord le char clickedbutton pour faire le traitement sur le mot mystère
((JButton)(arg0.getSource())).setEnabled(false);
if(tWord.isFound()==true){
jop.showMessageDialog(null, "Bravo t'a trouvé le mot !", "U don't Say B|", JOptionPane.INFORMATION_MESSAGE);
motTrouvé = true;
}
}
};
for(int i=0;i<letters.length;i++){
Button[i].addActionListener(buttonListener);
}
}
public void setNewWord(){
this.randWord = new Word();
this.tWord = new TreatedWord(randWord.getRandWord());
this.label3.setText(tWord.getStars());
}
public void resetButtons(){
for(JButton B : this.Button){
B.setEnabled(true);
}
}
public void addCustomListener(final CustomListener listener) {
this.customListener.add(listener);
}
public void notifyWordFound(/* any data you could use */) {
for(final CustomListener listener : this.customListener) {
listener.wordFound(/* any data you could use */);
}
}
}
MyJFrame代碼:
公共類FENETRE擴展的JFrame {
private JMenuBar menu = new JMenuBar();
private JMenu file = new JMenu("Fichier");
private JMenuItem neew = new JMenuItem("Nouveau");
private JMenuItem score = new JMenuItem("Score");
private JMenuItem quit = new JMenuItem("Quitter");
private JMenu about = new JMenu("About");
private JMenuItem how = new JMenuItem("Règles");
private JMenuItem who = new JMenuItem("Credit");
private int i=1;
private ScorePanel scorepan = new ScorePanel(900,650);
private ReglesJeuPanel rgpan = new ReglesJeuPanel(900,650);
private GamePanel gamepan = new GamePanel();
private JPanel pan = new JPanel();
private JPanel container = new JPanel();
private JLabel label = new JLabel("------------------------SAMAIKOM------------------------");
private JTextArea texte = new JTextArea( "Vous avez sept coups pour trouver le mot caché. Si vous réussissez, on recommence !\n" +
"Plus vous trouvez de mots, plus votre score augmente. Alors, à vous de jouer !\n" +
"Proverbe :\t« Pas vu, pas pris !\n" +
"\tPris ! PENDU ! »");
public Fenetre(){
this.setTitle("Le Pendu ...");
this.setSize(900, 650);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
initMenu();
initAcceuilPan();
initListeners();
this.setContentPane(container);
}
private void initMenu(){
file.add(neew);
file.add(score);
file.addSeparator();
file.add(quit);
file.setMnemonic('F');
neew.setMnemonic('N');
neew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,KeyEvent.CTRL_DOWN_MASK));
score.setMnemonic('S');
score.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,KeyEvent.CTRL_DOWN_MASK));
quit.setMnemonic('Q');
quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,KeyEvent.CTRL_DOWN_MASK));
about.add(how);
about.addSeparator();
about.add(who);
about.setMnemonic('A');
how.setMnemonic('R');
how.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,KeyEvent.CTRL_DOWN_MASK));
who.setMnemonic('C');
who.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,KeyEvent.CTRL_DOWN_MASK));
menu.add(file);
menu.add(about);
this.setJMenuBar(menu);
}
private void initListeners(){
score.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
container.removeAll();
container.add(scorepan);
}
});
quit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
how.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
container.removeAll();
container.add(rgpan);
}
});
neew.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
gamepan.setNewWord();
gamepan.resetButtons();
container.removeAll();
container.add(gamepan);
}
});
gamepan.addCustomListener(new CustomListener(){
public void wordFound() {
}
});
gamepan.notifyWordFound(); // where to put this ?????
}
private void initAcceuilPan(){
pan.setBackground(Color.white);
pan.add(new JLabel(new ImageIcon("131868.jpg")));
texte.setEditable(false);
Font F1 = new Font("arial",Font.BOLD,20);
Font F2 = new Font("arial",Font.BOLD,15);
label.setFont(F1);
texte.setFont(F2);
container.setBackground(Color.white);
container.add(label);
container.add(pan);
container.add(texte);
//container.add(gamepan);
}
public static void main(String[] args) {
Fenetre F1 = new Fenetre();
}
}
感謝名單,我理解,但我在哪裏打電話gamepan .notifyWordFound ???我的意思是我把它放在我的JFrame中?我編輯我的文章添加我的代碼,使其簡單 – FrankelStein
你需要通知,找到一個單詞(即使用'notifyWordFound'),當......找到一個單詞:) 基本上,我認爲你想使用它在哪裏測試'if(tWord.isFound()== true)'(在你的文件_GamePanel.java_的第90行左右,我相信,就像這樣調用它:'GamePanel.this.notifyWordFound();'。 By 'GamePan#notifyWordFound'應該是'private' :) – ccjmne
而且,if(tWord.isFound()== true)中不需要'== true',除非它在你看來更清楚,if 'tWord.isFound'是'true',以及它是'true',並且進入'if'的條件被驗證,沒有必要明確地將其與'true'進行比較。:) – ccjmne