2014-10-07 49 views
0

我使用JPanel來爲遊戲生活做一個GUI,我的類擴展了JFrame並實現了MouseListener,但是當我點擊一個JLabel時,MouseListener只能工作一次。Java MouseListener MouseClicked只能工作一次

任何想法該怎麼辦?它不是在我的GameOfLife類的代碼中的問題,因爲我也試圖打印一些字符串,它只能工作一次。

謝謝! 這裏是類:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.InputEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.image.BufferedImage; 

import javax.swing.*; 
import javax.swing.border.Border; 


public class GameOfLifeWindow extends JFrame implements ActionListener, MouseListener 
{ 
    private static final int DEF_ROWS = 16; 
    private static final int DEF_COLS = 16; 
    private JLabel[][] cells; 
    GameOfLife gol; 
    private JPanel panClear; 
    private JPanel panCenter; 
    private JPanel panNextGen; 
    private JButton nextGen; 
    private JButton clear; 
    private JMenuBar menuBar; 
    private JMenu file; 
    private JMenuItem newGame; 
    private JMenuItem loadFile; 

    public GameOfLifeWindow() 
    { 
     super("Game Of Life"); 
     gol = new GameOfLife(DEF_ROWS, DEF_COLS); 

     //sets layout and dimension 
     this.getContentPane().setLayout(new BorderLayout()); 
     this.getContentPane().setPreferredSize(new Dimension(300,400)); 

     //Sets the panels 
     panClear = new JPanel(new FlowLayout()); 
     panCenter = new JPanel(new GridLayout(gol.getRows(), gol.getCols())); 
     panNextGen = new JPanel(new FlowLayout()); 

     //Adds the panel to the JFrame 
     this.getContentPane().add(panClear, BorderLayout.NORTH); 
     this.getContentPane().add(panCenter, BorderLayout.CENTER); 
     this.getContentPane().add(panNextGen, BorderLayout.SOUTH); 

     //Sets the next generation button 
     this.nextGen = new JButton("Next Generation"); 
     panNextGen.add(this.nextGen); 
     this.nextGen.addActionListener(this); 
     //Sets the clear button 
     ImageIcon btnIcon = new ImageIcon(getClass().getResource("images/clear.png")); 
     Image tmpImg = btnIcon.getImage(); 
     BufferedImage bi = new BufferedImage(30, 30, BufferedImage.TYPE_INT_ARGB); 
     Graphics g = bi.createGraphics(); 
     g.drawImage(tmpImg, 0, 0, 30, 30, null); 
     this.clear = new JButton(new ImageIcon(bi)); 
     this.clear.addActionListener(this); 
     panClear.add(clear); 

     //Set the GridLayout 
     this.updateGeneration();   

     //Set the mouse listener to each cell 
     for(int i = 0 ; i < this.cells.length ; i++) 
      for(int j = 0 ; j < this.cells[i].length ; j++) 
       this.cells[i][j].addMouseListener(this); 

     //Sets MenuBar 
     this.menuBar = new JMenuBar(); 
     this.setJMenuBar(menuBar); 

     //Sets the File menu 
     this.file = new JMenu("File"); 
     menuBar.add(file); 
     //Sets the New Game in the file 
     this.newGame = new JMenuItem("New Game"); 
     this.newGame.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, InputEvent.CTRL_MASK)); 
     this.newGame.addActionListener(this); 
     file.add(this.newGame); 

     //Sets the Load File in the file 
     this.loadFile = new JMenuItem("Load File"); 
     this.loadFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2, InputEvent.CTRL_MASK)); 
     this.loadFile.addActionListener(this); 
     file.add(this.loadFile); 
    } 

    public void updateGeneration() 
    //updates the JLabels according to the Game Of Life Screen 
    { 
     Border border = BorderFactory.createLineBorder(Color.LIGHT_GRAY); 
     this.getContentPane().remove(this.panCenter); 
     this.panCenter = new JPanel(new GridLayout(gol.getRows(), gol.getCols())); 
     this.cells = new JLabel[gol.getRows()][gol.getCols()]; 
     this.panCenter.removeAll(); 
     for(int i = 0 ; i < cells.length ; i++) 
      for(int j = 0 ; j < cells[i].length ; j++) 
      { 
       this.cells[i][j] = new JLabel(); 
       this.cells[i][j] .setOpaque(true); // make the color visible 
       this.cells[i][j].setBorder(border);// sets borders 
       if(gol.isAlive(i, j)) 
        this.cells[i][j].setBackground(Color.BLACK); 
       else 
        this.cells[i][j].setBackground(Color.white); 
       panCenter.add(this.cells[i][j]); 
      } 

     this.getContentPane().add(this.panCenter); 
     this.setVisible(true);  
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource() == this.nextGen) 
     { 
      this.gol.nexGeneration(); 
      this.updateGeneration(); 
     } 
     else if(e.getSource() == this.clear) 
     { 
       this.gol = new GameOfLife(DEF_ROWS, DEF_COLS); 
       this.updateGeneration(); 
     } 
     else if(e.getSource() == this.newGame) 
     { 
      this.gol = new GameOfLife(DEF_ROWS, DEF_COLS); 
      this.updateGeneration(); 
     } 
     else if(e.getSource() == this.loadFile) 
     { 
      String fileName = JOptionPane.showInputDialog("Please Enter A File Name"); 
      this.gol = new GameOfLife(fileName); 
      System.out.println(gol.toString()); 
      this.updateGeneration(); 
     } 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) 
    { 
     boolean found = false; 
     for(int i = 0 ; i < cells.length && !found ; i++) 
      for(int j = 0 ; j < cells[i].length && !found; j++) 
       if(e.getSource() == this.cells[i][j]) 
       { 
        this.gol.setForGUI(i, j); 
        found = true; 
       } 
     this.updateGeneration(); 
     System.out.println("asdsad"); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    } 
} 
+0

即使不需要它們,使用括號{}也是一種很好的做法。 – 2014-10-07 15:04:59

+0

好的,謝謝你的建議,你知道代碼中可能有什麼錯嗎? – Pachu 2014-10-07 15:15:41

+0

不知道。你的代碼不會編譯。它缺少一個類 – 2014-10-07 15:23:49

回答

1

在構造函數分配一個鼠標監聽到所有的細胞,你在的Jlabel多維數組有。但是,然後在updateGeneration()中創建另一個JLabel [] []數組,但不要再將鼠標監聽器分配給單元格。

要解決您需要在updateGeneration()中再次添加一個鼠標監聽器到所有的單元格。或者不是創建一個新的JLabel [] []只是更新現有數組中的JLabel的狀態。

+0

謝謝男人,祝你有個愉快的一週! – Pachu 2014-10-07 15:29:39