2013-05-26 4 views
0

코드가 정상적으로 작동합니다. 클릭을하면 모든 것이 코드화됩니다. 유일한 문제는 동일한 지점을 클릭하고 싶지 않다는 것입니다. 그 해결책을 찾지 못해. 어떤 제안?JPanel [] [] 테이블에서 mouseListener를 한 번 클릭하십시오.

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 [] [] 테이블이 2 차원입니다 .JPanel에서 클릭하면 backrounf 색상이 빨간색 또는 흰색으로 바뀝니다 .JPanel에서 클릭하면 다시 그 코드를 클릭하고 싶지 않습니다. 나는 그것을 할 수 없다고 게시했다. 나는 당신이 나의 코드를 이해하도록 도와 주었으면 좋겠다! –

+0

모든 셀에 대해 새 MouseListener를 만들지 마십시오. 1 개의 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

나는 boolean [] [] 테이블이있는 테이블을 false로 초기화하는 솔루션을 시도했으며, JPanel을 클릭하면이 boolean이 true가됩니다. 문제는 동일한 지점을 다시 칠 수 있다는 것입니다! 어쨌든 관심을 가져 주셔서 감사합니다. –

+0

한 번 패널을 클릭하면 다시 클릭 할 수 없습니까? 왜 마우스 수신기를 제거하지 않습니까? – MadProgrammer

+0

나는 그것을 얻고 싶지만 나는 기울이지 않는다. JPanel을 클릭하면 다시 클릭 할 수 없다. –