создать событие, нажав на jlabel

#java

#java

Вопрос:

Я хочу создать событие при нажатии на JLabel , когда значение playertyp равно 1, как я могу это сделать? это класс

 public class Draw_Board implements MouseListener,ActionListener
{

    private Point matloc;
    private ImageIcon partpic;
    private JLabel partstick;

    private boolean playerexis;
    private int playertyp=0;
    private boolean partexis;
    private boolean compute;
    private Part[][] map;



    public Draw_Board()
    {

        int x = 52;
        int y =49;

        map=new Part[9][12];
        for(int i=0;i<9;i  )
        {
            for(int j=0;j<12;j  )
            {
                matloc=new Point();
                if(i==j amp;amp; i==0)
                    {
                    partpic = new ImageIcon(getClass().getResource( "images/bird.png" ));
                    playertyp=1;//the bird equal to player 1

                    }
                else{
                    partpic = new ImageIcon(getClass().getResource( "images/stone.png" ));
                    playertyp=2;
                }

                partstick = new JLabel("",partpic,JLabel.CENTER);
                partstick.addMouseListener(this);

                matloc.setX(x);
                matloc.setY(y);
                x =61;
                if(j==11)
                {
                    x=52;
                    y =57;
                }




                partstick.setLocation(matloc.getX(),matloc.getY());
                partstick.setSize(60,60);

                map[i][j]=new Part(matloc,  partpic,  partstick,
                         playerexis, playertyp, partexis,   compute);

            //  if(i==0 amp;amp; j==0)System.out.println(partstick.getX() " " partstick.getY());


            }
        }   

    }




    public void draw(Panelmenu p)
    {


        for (int i = 0; i < 9; i  ) 
        {
            for (int j = 0; j < 12; j  ) 
            {
                map[i][j].draw(p);

            }
        }

    }








    public Point getMatloc() {
        return matloc;
    }




    public void setMatloc(Point matloc) {
        this.matloc = matloc;
    }




    public ImageIcon getPartpic() {
        return partpic;
    }




    public void setPartpic(ImageIcon partpic) {
        this.partpic = partpic;
    }




    public JLabel getPartstick() {
        return partstick;
    }




    public void setPartstick(JLabel partstick) {
        this.partstick = partstick;
    }




    public boolean isPlayerexis() {
        return playerexis;
    }




    public void setPlayerexis(boolean playerexis) {
        this.playerexis = playerexis;
    }




    public int getPlayertyp() {
        return playertyp;
    }




    public void setPlayertyp(int playertyp) {
        this.playertyp = playertyp;
    }




    public boolean isPartexis() {
        return partexis;
    }




    public void setPartexis(boolean partexis) {
        this.partexis = partexis;
    }




    public boolean isCompute() {
        return compute;
    }




    public void setCompute(boolean compute) {
        this.compute = compute;
    }




    public Part[][] getMap() {
        return map;
    }




    public void setMap(Part[][] map) {
        this.map = map;
    }






    @Override
    public void actionPerformed(ActionEvent e)
    {


    }

    @Override
    public void mouseClicked(MouseEvent e) {




    }

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

    }

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

    }

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

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

    }

}
  

Ответ №1:

Используйте JButton вместо JLabel, тогда вы можете просто добавить ActionListener к кнопке. Вы можете придать кнопке вид метки, используя:

 button.setBorderPainted( false );
  

Когда вы устанавливаете значок, вы можете использовать метод setActionCommand (…) для управления обработкой при нажатии кнопки.

Прочитайте раздел из руководства по Swing о том, как использовать кнопки, для объяснения и примера.

я хочу создать событие только тогда, когда значение playertyp равно 1

Затем, когда вы измените значок, вы можете удалить ActionListener с кнопки, чтобы событие не генерировалось.

Комментарии:

1. я добавляю addMouseListener(this); для всех jlabels в массиве, но я хочу создать событие только тогда, когда playertyp равен 1

Ответ №2:

Переместите ваше объявление JLabel перед if (i == j amp;amp; i == 0) инструкцией и добавляйте прослушиватель мыши только тогда, когда вы установите playertyp значение один:

 matloc=new Point();
partstick = new JLabel("",partpic,JLabel.CENTER);

if(i==j amp;amp; i==0) {
   partpic = new ImageIcon(getClass().getResource( "images/bird.png" ));
   playertyp=1;//the bird equal to player 1
   partstick.addMouseListener(this); // Add mouse listener only when partype = 1
} else {
    partpic = new ImageIcon(getClass().getResource( "images/stone.png" ));
    playertyp=2;
}
  

Комментарии:

1. но я хочу, чтобы изображение в j ==0 и i == 0 было удалено

Ответ №3:

Вы могли бы создать подкласс a, JLabel который реализует a MouseListener . Подкласс также сохранит родительский объект, который его создал, так что при вызове mouseClicked метода MouseListener он вызовет соответствующий метод в родительском объекте.

 public class MyJLabel extends JLabel implements MouseListener {

public MyJLabel(String title) {
super(title);
addMouseListener(this);
}

public void mouseClicked(MouseEvent e) {
//YOUR RESPONSE HERE
}

public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}

}