2013-05-26 48 views
0

该代码工作正常。当我离开它时,代码将描述所有内容。唯一的问题是我不想点击同一个地点!我可以找不到解决办法。有什么建议吗?Single Click with mouseListener on JPanel [] []表

for (int i = 0; i < rows; i++) { 
     for (int j = 0; j < cols; j++) { 
      innerCells[i][j] = new JPanel(); 
      innerCells[i][j].setLayout(new BorderLayout()); 
      innerCells[i][j].setBorder(BorderFactory.createLineBorder(lineColor)); 
      innerCells[i][j].setBackground(backgroundColor); 
      innerCells[i][j].addMouseListener(new MouseListener() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        JPanel k = (JPanel) e.getSource(); 
        JLabel l = new JLabel("", JLabel.CENTER); 
        int x = getRows(); 
        int y = getCols(); 
        for (int r = 0; r < getRows(); r++) { 
         for (int c = 0; c < getCols(); c++) { 
          if (innerCells[r][c] == k) { 
           x = r; 
           y = c; 
          } 
         } 
        } 
        if (array[x][y] == 0) { 
         l.setBackground(k.getBackground()); 
         k.add(l); 
         k.setBackground(Color.white); 
         k.revalidate(); 
        } else { 
         l.setBackground(k.getBackground()); 
         k.add(l); 
         k.setBackground(Color.red); 
         k.revalidate(); 
        } 
        randomHits(); 
       } 
+0

你能否尝试用更清晰的方式阐明你的问题? –

+0

我有一个JPanel [] []表二维。当我点击一个JPanel时,它的backrounf颜色变成红色或白色。事情是,当我点击JPanel我不想再次点击那里,但与该代码我贴了我不能这样做!我希望我帮你理解我的代码! –

+0

不要为每个单元格创建一个新的MouseListener。创建一个MouseListener并为每个单元格添加相同的侦听器。 – camickr

回答

0

家伙感谢帮助我通过设法找到解决办法喽!我有只添加一行代码,我的意思是只有一个检查!解决方案是

如果(k.getComponents()。长度== 0)

这意味着如果它点击它不是0.谢谢大家的努力!

for (int i = 0; i < rows; i++) { 
     for (int j = 0; j < cols; j++) { 
      innerCells[i][j] = new JPanel(); 
      innerCells[i][j].setLayout(new BorderLayout()); 
      innerCells[i][j].setBorder(BorderFactory.createLineBorder(lineColor)); 
      innerCells[i][j].setBackground(backgroundColor); 
      innerCells[i][j].addMouseListener(new MouseListener() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        JPanel k = (JPanel) e.getSource(); 
        JLabel l = new JLabel("", JLabel.CENTER); 
        int x = getRows(); 
        int y = getCols(); 
        for (int r = 0; r < getRows(); r++) { 
         for (int c = 0; c < getCols(); c++) { 
          if (innerCells[r][c] == k) { 
           x = r; 
           y = c; 
          } 
         } 
        } 
        if (k.getComponents().length == 0) { 
         if (array[x][y] == 0) { 
          l.setBackground(k.getBackground()); 
          k.add(l); 
          k.setBackground(Color.white); 
          k.revalidate(); 
         } else { 
          l.setBackground(k.getBackground()); 
          k.add(l); 
          k.setBackground(Color.red); 
          playerhit++; 
          GameScreen.FinalWinner(); 
          k.revalidate(); 
         } 
         randomHits(); 

        } 
       } 
3

如果面板从未需要应对的另一个鼠标点击,只需dereigster相关的鼠标监听...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class NoMoreClicks { 

    public static void main(String[] args) { 
     new NoMoreClicks(); 
    } 

    public NoMoreClicks() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      add(new JLabel("Single Clicked Pane...")); 
      addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        e.getComponent().removeMouseListener(this); 
        JOptionPane.showMessageDialog(e.getComponent(), "Was Clicked"); 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

} 
+0

我尝试了一个解决方案,用一个布尔型[] []表初始化表中的表false,当我们点击一​​个JPanel时,这个布尔值变成true。事情是我可以再次击中同一个点! 无论如何感谢您的兴趣! –

+0

所以一旦你点击一个面板,它再也不能被点击了吗?为什么不移除鼠标监听器? – MadProgrammer

+0

我想实现,但我不能。我想要一个JPanel点击它不能再次点击! –