简体   繁体   English

鼠标单击JLabel数组(Java)

[英]Mouse click on JLabel array (Java)

I create a JLabels array which is [9][9] on java. 我创建了一个JLabels数组,在Java上是[9] [9]。 and i want to set visible these JLabels when i clicked with mouse on these labels. 并且我想在用鼠标单击这些标签时将这些JLabels设置为可见。 Anyone can help me? 有人可以帮助我吗?

I tried this:
    //labels[c][d].addMouseListener(null);
    public void mouseClicked(MouseEvent me){
    //        for(Integer i=1;i<10;i++)
    //        {
    //            for(Integer j=1;j<10;j++)
    //            {
    //               
    //                if (me.getSource()==labels[i][j]);
    //                {
    //                  
    //                    labels[1][1].setVisible(true);
    //                }
    //            }
    //       
    //    }

Use a JToggleButton as shown in Swing JToolbarButton pressing . 使用JToggleButton ,如按Swing JToolbarButton所示。

In your use-case, the green unselected image will simply be either a fully transparent image, or an image that is the desired BG color. 在您的用例中,绿色的未选择图像将仅仅是完全透明的图像,或者是所需BG颜色的图像。

More specific example: 更具体的例子:

切换图片

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

class ToggleImage {

    public static JToggleButton getButton(
        Image selected,
        Image unselected) {

        JToggleButton b = new JToggleButton();
        b.setSelectedIcon(new ImageIcon(selected));
        b.setIcon(new ImageIcon(unselected));
        b.setBorderPainted(false);
        b.setContentAreaFilled(false);
        b.setFocusPainted(false);
        b.setMargin(new Insets(0,0,0,0));

        return b;
    }

    public static Image getImage(boolean hasSquare) {
        int size = 60;
        BufferedImage bi = new BufferedImage(
            size,size,BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = bi.createGraphics();

        if (hasSquare) {
            g.setColor(Color.RED);
            g.fillRect(1,1,size-2,size-2);
        }

        g.dispose();
        return bi;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                Image selected = getImage(true);
                Image unselected = getImage(false);

                int row = 2;
                int col = 5;
                JPanel p = new JPanel(new GridLayout(row,col));

                for (int ii=0; ii<row*col; ii++) {
                    p.add( getButton(selected, unselected) );
                }

                JOptionPane.showMessageDialog(null, p);
            }
        });
    }
}

Note that a button will react to both mouse and keyboard input, whereas (by default) a label won't. 请注意,按钮将同时响应鼠标和键盘输入,而(默认情况下)标签将不响应。

If all those JLabels are invisible at the beginning - they won't be able to catch mouse/key events. 如果所有这些JLabel在开始时都是不可见的-它们将无法捕获鼠标/键事件。 If you want to show labels content only after click on them - just don't set their text before they recieve a click, like this: 如果要仅在单击标签后才显示标签内容-只需在他们获得点击之前就不要设置其文本,如下所示:

public static void main ( String[] args )
{
    JFrame frame = new JFrame ();
    frame.setLayout ( new GridLayout ( 9, 9 ) );
    frame.getContentPane ().setPreferredSize ( new Dimension ( 300, 300 ) );

    final Random random = new Random ();
    for ( int i = 0; i < 9; i++ )
    {
        for ( int j = 0; j < 9; j++ )
        {
            final JLabel label = new JLabel ( "", JLabel.CENTER );
            label.setBorder ( BorderFactory.createLineBorder ( Color.LIGHT_GRAY ) );
            label.addMouseListener ( new MouseAdapter ()
            {
                public void mousePressed ( MouseEvent e )
                {
                    label.setText ( "" + random.nextInt ( 100 ) );
                }
            } );
            frame.add ( label );
        }
    }

    frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
    frame.pack ();
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

The code you posted does not seem to bad. 您发布的代码似乎还不错。 But you always set the label at index [1][1] visible instead of using [i][j] . 但是,您始终将标签设置为可见的索引[1][1]而不是使用[i][j]

And of course, if your JLabel really is the source of the MouseEvent you can ditch the whole looping mechanism altogher, eg if you use 当然,如果您的JLabel确实是MouseEvent的来源,则可以放弃整个循环机制,例如,如果您使用

me.getSource()==labels[i][j]

to determine which label you need to set to visible, you can replace the whole double loop by 要确定需要设置为可见的标签,可以将整个double循环替换为

((JLabel)me.getSource()).setVisible( true );

I hope this helps. 我希望这有帮助。

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Clicker extends JPanel {
    private static final int ROWS = 9; 
    private static final int COLUMNS = 9;

    public Clicker() {
        setLayout(new GridLayout(COLUMNS, ROWS));

        JLabel labels[][] = new JLabel[ROWS][];
        for (int i = 0; i < ROWS; i++) {
            labels[i] = new JLabel[COLUMNS];    
        }

        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLUMNS; j++) {
                labels[i][j] = new JLabel();
                labels[i][j].addMouseListener(createMouseListener());
                add(labels[i][j]);
            }
        }
    }

    public MouseAdapter createMouseListener() {
        return new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                JLabel label = (JLabel)e.getSource();

                if (!label.isEnabled()) {
                    label.setText("");
                    label.setEnabled(true);
                } else {
                    label.setText("Clicked");
                    label.setEnabled(false);
                }
            }
        };
    }


    public static void main(String[] args) {
        JFrame frame = new JFrame("Click me demo.");
        frame.setSize(500, 500);
        frame.setLayout(new BorderLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Clicker(),BorderLayout.CENTER);
        frame.setVisible(true);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM