2014-09-08 2 views
1

JButton의 상속 된 클래스 인 BoardSquare이 있습니다. 각각의 BoardSquare 개체는 BoardSquare[][] boardsquares 배열에 저장됩니다. 나는 그들의 좌표에 따라 배열의 사각형의 각 레이블을 추가하려면 다음 코드이러한 JLabel을 보이지 않게 만드는 방법

BoardSquare.boardSquares[j][i].add(new JLabel((j+1)+":"+(i+1)));

을 사용했다. 나는 그들을 식별 할 수 있도록이 라벨을 가지고 있어야한다고 생각합니다 (addActionListeners 등). JLabels를 보이지 않게하여 JFrame에 나타나지 않게하려면 어떻게해야합니까?

다른 방법으로 각 버튼의 JLabel을 인스턴스 변수로 만들면 JLabel.setVisible(false)을 호출 할 수 있지만 액션 리스너를 추가 할 때 사용할 수 있습니까?

편집 : 관심있는 사람은 체커 게임입니다. 대신 직접 배열에) 새로운 JLabel의을 (추가하는 첫 번째 인스턴스를 만들 MyListener

+2

... 작업중인 (http://mywiki.wooledge.org/XyProblem). 이 모든 것이 무엇에 사용됩니까? 지뢰 찾기 게임? 사용자가 GUI 및이 구성 요소에서 경험하게 될 행동은 무엇입니까? 당신이하려고하는 것이 무엇이든지간에 더 나은 접근법이있을 수 있습니다. 그래서 당신이 그 접근법을 찾을 수 있도록 도와 드리겠습니다. –

+0

왜 레이블을 추가 할 수 없는지 이해할 수 없습니다. actionlisteners를 추가하기를 원한다면 왜 그냥 BoardSquare.boardSquares [j] [i] .addActionListener (...);'를하지 않을까요? –

+0

@HovercraftFullOfEels 제발 내 편집을 참조하십시오. – aidandeno

답변

0


GameWindow
BoardSquare
Checker
는 그 추가 ... 내가 추측 : 여기

내 클래스입니다 이것은 루프로 이루어 지므로 예 :

JLabel lbl; 
for(....) { 
lbl = new JLabel(new JLabel((j+1)+":"+(i+1)); 
lbl.addActionListener(new ActionListener(){ 

public void actionPerformed(ActionEvent evt()){ 
    // TODO here 
    } 
}); 
BoardSquare.boardSquares[j][i].add(lbl); 
3

고맙습니다 편집. 이것이 내 응용 프로그램이라면, 아마도 매우 다른 것을 할 것입니다.

  • JButton이 아닌 JLabel의 그리드를 사용하십시오. JButton을 사용할 필요가 없으며 버튼이 다른 가능한 솔루션처럼 시각적으로 매력적이지 않을 것이라는 점에서 문제가 있습니다.
  • 중 하나 JLabel의 세포 또는 포함하는 JPanel의의 MouseListener,
  • 더 검사기가 그들에없는 경우 비어 따라서 어떤 아이콘이없고 JPanel의 세포를 가지고,
  • 을 제공하거나이 적절하게 색 검사기의 이미지 아이콘을 누르고 있습니다 그들이 비어 있지 않으면.
  • 유리창을 사용하여 사용자가 드래그 할 수있는 적절한 체커 ImageIcon으로 JPanel을 유지함으로써 GUI에 애니메이션을 적용 할 수도 있습니다.

절대적으로 JButton을 사용해야하는 경우에는 JLabel을 추가하지 마십시오. 대신 단순히 JButton 아이콘을 null 또는 적절한 Checker ImageIcon으로 설정하십시오. 예를 들어


편집
, 개념의 증거로 나쁜 코드 예제. 이것을 컴파일하고 실행 해보십시오.

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.util.EnumMap; 
import java.util.Map; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class Checkers extends JPanel { 
    public static final int SIDE_LENGTH = 60; 
    public static final int ROW_COUNT = 8; 
    private static final String ROW = "row"; 
    private static final String COLUMN = "column"; 
    private static final Color LIGHT_COLOR = new Color(210, 180, 140); 
    private static final Color DARK_COLOR = new Color(107, 68, 35); 
    private Map<Checker, Icon> checkerIconMap = new EnumMap<Checker, Icon>(
     Checker.class); 
    private JLabel[][] labelGrid = new JLabel[ROW_COUNT][ROW_COUNT]; 
    private Checker[][] checkerGrid = new Checker[ROW_COUNT][ROW_COUNT]; 

    public Checkers() { 
     for (Checker checker : Checker.values()) { 
     checkerIconMap.put(checker, createCheckerIcon(checker)); 
     } 
     setLayout(new GridLayout(ROW_COUNT, ROW_COUNT)); 

     for (int row = 0; row < labelGrid.length; row++) { 
     for (int col = 0; col < labelGrid[row].length; col++) { 
      checkerGrid[row][col] = Checker.EMPTY; 
      JLabel gridCell = new JLabel(checkerIconMap.get(Checker.EMPTY)); 
      gridCell.setOpaque(true); 
      gridCell.putClientProperty(ROW, row); 
      gridCell.putClientProperty(COLUMN, col); 
      Color c = row % 2 == col % 2 ? LIGHT_COLOR : DARK_COLOR; 
      gridCell.setBackground(c); 
      add(gridCell); 
      labelGrid[row][col] = gridCell; 
     } 
     } 

     for (int i = 0; i < labelGrid.length/2 - 1; i++) { 
     for (int j = 0; j < labelGrid.length/2; j++) { 
      int row = i; 
      int col = j * 2; 
      col += row % 2 == 0 ? 1 : 0; 
      labelGrid[row][col].setIcon(checkerIconMap.get(Checker.BLACK)); 
      checkerGrid[row][col] = Checker.BLACK; 

      row = ROW_COUNT - row - 1; 
      col = ROW_COUNT - col - 1; 
      labelGrid[row][col].setIcon(checkerIconMap.get(Checker.RED)); 
      checkerGrid[row][col] = Checker.RED; 
     } 
     } 

     MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
     addMouseListener(myMouseAdapter); 
     addMouseMotionListener(myMouseAdapter); 
    } 

    private Icon createCheckerIcon(Checker checker) { 
     BufferedImage img = new BufferedImage(SIDE_LENGTH, SIDE_LENGTH, 
      BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2 = img.createGraphics(); 
     g2.setColor(checker.getColor()); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     int x = 3; 
     int y = x; 
     int width = SIDE_LENGTH - 2 * x; 
     int height = width; 
     g2.fillOval(x, y, width, height); 
     g2.dispose(); 

     return new ImageIcon(img); 
    } 

    private class MyMouseAdapter extends MouseAdapter { 
     private int selectedRow = -1; 
     private int selectedCol = -1; 
     private Checker selectedChecker = null; 
     private JPanel glassPane = null; 
     private Point p = null; 
     private JLabel movingLabel = new JLabel(checkerIconMap.get(Checker.EMPTY)); 

     public MyMouseAdapter() { 
     movingLabel.setSize(movingLabel.getPreferredSize()); 
     movingLabel.setVisible(false); 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
     p = e.getPoint(); 
     for (int row = 0; row < labelGrid.length; row++) { 
      for (int col = 0; col < labelGrid[row].length; col++) { 
       JLabel gridCell = labelGrid[row][col]; 
       if (gridCell == getComponentAt(p)) { 
        if (checkerGrid[row][col] != Checker.EMPTY) { 
        selectedRow = row; 
        selectedCol = col; 
        selectedChecker = checkerGrid[row][col]; 
        checkerGrid[row][col] = Checker.EMPTY; 
        labelGrid[row][col].setIcon(checkerIconMap.get(Checker.EMPTY)); 

        JRootPane rootPane = SwingUtilities.getRootPane(Checkers.this); 
        glassPane = (JPanel) rootPane.getGlassPane(); 
        glassPane.setVisible(true); 
        glassPane.setLayout(null); 
        movingLabel.setIcon(checkerIconMap.get(selectedChecker)); 
        movingLabel.setVisible(true); 
        glassPane.add(movingLabel); 
        int x = p.x - SIDE_LENGTH/2; 
        int y = p.y - SIDE_LENGTH/2; 
        movingLabel.setLocation(x, y); 
        } 
       } 
      } 
     } 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
     if (selectedChecker == null) { 
      return; 
     } 

     p = e.getPoint(); 
     if (!Checkers.this.contains(p)) { 
      // if mouse releases and is totally off of the grid 
      returnCheckerToOriginalCell(); 
      clearGlassPane(); 
      return; 
     } 

     for (int row = 0; row < labelGrid.length; row++) { 
      for (int col = 0; col < labelGrid[row].length; col++) { 
       JLabel gridCell = labelGrid[row][col]; 
       if (gridCell == getComponentAt(p)) { 
        if (isMoveLegal(row, col)) { 
        checkerGrid[row][col] = selectedChecker; 
        labelGrid[row][col].setIcon(checkerIconMap.get(selectedChecker)); 

        // todo: check for jumped pieces... 
        } else { 
        // illegal move 
        returnCheckerToOriginalCell(); 
        } 
       } 
      } 
     } 
     clearGlassPane(); 
     } 

     // this code would go in the model class 
     private boolean isMoveLegal(int row, int col) { 
     if (checkerGrid[row][col] != Checker.EMPTY) { 
      // trying to put a checker on another checker 
      returnCheckerToOriginalCell(); 
     } else if (row == selectedRow && col == selectedCol) { 
      // trying to put checker back in same position 
      returnCheckerToOriginalCell(); 
     } else if (row % 2 == col % 2) { 
      // invalid square 
      returnCheckerToOriginalCell(); 
     } else { 
      // TODO: more logic needs to go here to test for a legal move 
      // and to remove jumped pieces 

      return true; 
     } 
     return false; 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
     if (selectedChecker == null || p == null) { 
      return; 
     } 
     p = e.getPoint(); 
     int x = p.x - SIDE_LENGTH/2; 
     int y = p.y - SIDE_LENGTH/2; 
     movingLabel.setLocation(x, y); 
     } 

     private void clearGlassPane() { 
     glassPane.setVisible(false); 
     movingLabel.setVisible(false); 
     selectedChecker = null; 
     p = null; 
     selectedCol = -1; 
     selectedRow = -1; 
     } 

     private void returnCheckerToOriginalCell() { 
     checkerGrid[selectedRow][selectedCol] = selectedChecker; 
     labelGrid[selectedRow][selectedCol].setIcon(checkerIconMap.get(selectedChecker)); 
     } 
    } 

    private static void createAndShowGui() { 
     Checkers mainPanel = new Checkers(); 

     JFrame frame = new JFrame("JLabelGrid"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class CheckerModel { 

} 

enum Checker { 
    EMPTY(new Color(0, 0, 0, 0)), RED(Color.red), BLACK(Color.black); 
    private Color color; 

    private Checker(Color color) { 
     this.color = color; 
    } 

    public Color getColor() { 
     return color; 
    } 
} 

더 나은 모델 - 뷰 예제이 가능한 [XY 문제] 같은 소리

+1

* "버튼이 다른 가능한 솔루션처럼 시각적으로 매력적이지는 않을 것입니다."* 뭐라 구요? 체스 GUI에서와 같이 버튼이 효과적으로 보이지 않을 수 있다는 점을 감안할 때 버튼이 표시하는 아이콘보다 덜 아름답다는 것을 알지 못합니다. –

+0

@AndrewThompson : 사실이긴하지만 어쩌면 나에게 "옳은"느낌이 들지 않는 것 중 하나에 도달했을 것입니다. 셀은 버튼처럼 작동하지만 클릭 가능한 위치 (다시 JLabel은 훌륭하게 작동합니다)로 아이콘을 보유하고 우울하지는 않습니다. 어쩌면 나는 단지 완고하다. 예를 들어 아이콘을 바꿔 넣는 JButton으로 작동 할 것이기 때문이다. (사실 내 의견을보기 전에 실제로 대답을 추가했기 때문이다.) 그러나 코멘트 주셔서 감사합니다! –

+0

* "사용자가 드래그 할 수 있습니다."* Arrg .. 마우스에 도전 한 사용자는 어떻습니까? 다른 주에 마우스가 없으며 키보드 만 사용하여 Solitaire를 사용하고있었습니다. –

관련 문제