2014-09-14 2 views
-2

해당 이미지를 클릭하여이 코드에서 imageicon이 사용하는 아이콘을 다른 것으로 변경하고 싶습니다. 아무도 나를 도와 줄 수 있니? 이 코드에서 무엇을 할 수 있습니까 ?? 그리고 바닥이 하얀색으로 채워지면 가을을 내리고 싶습니다. 한 사용자가 흰 점을 클릭하면 색이 노란색으로 바뀌고 다시 한 번 다른 흰 색을 클릭하면 붉은 색으로 바뀝니다. 그것도 JLabel으로 가능한 비록자바에서 이미지를 클릭하여 다른 이미지로 변경하려면 어떻게해야합니까?

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 


class Connect4Games extends JFrame implements ActionListener, MouseListener 
{ 
JFrame frame; 
JPanel pane; 
JLabel insertaxis[][]; 
ImageIcon EmptySpace, circleYellow, circleRed ; 
BufferedImage bufferedImage; 
public Connect4Games() { 
    LookAndFeel.setLookAndFeel(); 
    pane = new JPanel(); 
    frame = new JFrame(); 
    insertaxis = new JLabel[6][7]; 
    EmptySpace = new ImageIcon("image/Circle.png"); 
    circleYellow = new ImageIcon("image/Circle2.png"); 
    circleRed = new ImageIcon("image/Circle3.png"); 
    pane.setLayout(new GridLayout(6, 7)); 
    pane.setBackground(Color.blue); 
    add(pane); 
    addMouseListener(this); 
    setTitle("Connect 4"); 
    setVisible(true); 
    setSize(670, 590); 
    frame.pack(); 
    setLocationRelativeTo(null); 
    setResizable(false); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


    for (int i = 0; i < 6; i++) { 
     for (int j = 0; j < 7; j++) { 
      insertaxis[i][j] = new JLabel(); 
      pane.add(insertaxis[i][j]); 
      insertaxis[i][j].setIcon(EmptySpace); 
     } 
    } 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
} 

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

@Override 
public void mouseClicked(MouseEvent e) { 
    int x = e.getX(); 
    int y = e.getY(); 

    if(e.getPoint() == null){ 
     insertaxis[x][y].setIcon(circleRed); 
    } 
} 

@Override 
public void mouseEntered(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseExited(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mousePressed(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void mouseReleased(MouseEvent e) { 
    // TODO Auto-generated method stub 

} 
+2

프레임 대신 마우스 이벤트를 캡처하려는 레이블에 mouselistener를 추가하십시오. –

+4

이 질문은 코드 완성에 관한 주제이므로 다루지 않습니다. –

답변

1

는 Personnally, 나는 이런 종류의 일에 대한 JButton를 사용하는 것을 선호합니다. JButton의 가장 큰 장점은 JLabel 이상이므로 "클릭해야"하게되므로 addActionListener 메서드를 직접 활용할 수 있습니다.

이제 버튼의 아이콘 색상을 설정하는 것보다 더 많은 작업을 수행해야합니다.하지만 그 시작입니다.

  • 당신은 당신이 실제로 사용 된 적이없는 JFrame를 만들 : 거기에 일부 실수가 있었기 때문에

    은 또한 약간의 코드를 리팩토링. 당신이 마지막으로 통화 중 하나 여야합니다 pack()setVisible(true)
  • 통화 (당신이 어떤 특정 동작을 추가하지 않는 경우 JFrame의를 확장 할 필요) 그 JFrame 대신 JFrame을 확장하지의 사용 실제로 좋은 생각
  • 스윙 UI의 모든 변경 사항은 EDT (Event Dispatching Thread)에서 수행해야하며 UI는 invokeLater 블록 내에서 시작되어야하며 EDT에서 실행되도록해야합니다.

다음은 JButton으로 쉽게 달성 할 수있는 방법을 보여주는 작은 구현 예입니다.

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Connect4Games { 
    JFrame frame; 
    JPanel pane; 
    JButton insertaxis[][]; 
    ImageIcon emptySpace, circleYellow, circleRed; 
    BufferedImage bufferedImage; 

    private boolean red = true; 

    public Connect4Games() { 
     frame = new JFrame(); 
     pane = new JPanel(); 
     insertaxis = new JButton[6][7]; 
     emptySpace = new ImageIcon(getCircle(Color.GRAY)); 
     circleYellow = new ImageIcon(getCircle(Color.YELLOW)); 
     circleRed = new ImageIcon(getCircle(Color.RED)); 
     pane.setLayout(new GridLayout(6, 7)); 
     pane.setBackground(Color.blue); 
     frame.add(pane); 
     frame.setTitle("Connect 4"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     for (int i = 0; i < 6; i++) { 
      for (int j = 0; j < 7; j++) { 
       final JButton button = new JButton(); 
       button.setBorderPainted(false); 
       button.setContentAreaFilled(false); 
       button.setFocusPainted(false); 
       button.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         if (button.getIcon() == emptySpace) { 
          if (red) { 
           button.setIcon(circleRed); 
          } else { 
           button.setIcon(circleYellow); 
          } 
          red = !red; 
         } else { 
          JOptionPane.showMessageDialog(button, "Sorry, you cannot change the color of this place"); 
         } 
        } 
       }); 
       insertaxis[i][j] = button; 
       pane.add(insertaxis[i][j]); 
       insertaxis[i][j].setIcon(emptySpace); 
      } 
     } 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 

     frame.setVisible(true); 
    } 

    private static BufferedImage getCircle(Color color) { 
     BufferedImage image = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB); 
     Graphics g = image.getGraphics(); 
     g.setColor(color); 
     g.fillArc(0, 0, 32, 32, 0, 360); 
     return image; 
    } 

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

} 
+0

대단히 감사합니다. D –

+0

서클을 좀 더 가까이서 만들 수 있습니까? ...... 나는 더 가까이 다가 갈 생각이 없습니다. 사촌 자바에서 신인. 제발 도와주세요 –

+0

@ JackRourke 각 버튼에 대한 사용자 정의 값 테두리를 설정합니다. 뭔가 :'button.setBorder (BorderFactory.createEmptyBorder (1, 1, 1, 1));'. 값을 요구 사항에 맞게 조정할 수 있습니다 (원하는 경우 0 일 수도 있음). –

관련 문제