鼠标单击JLabel数组(Java)
我创建了一个JLabels数组,它在java上是[9][9]。当我用鼠标点击这些标签时,我想将这些jlabel设置为可见。有人能帮我吗鼠标单击JLabel数组(Java),java,arrays,swing,jlabel,mouse-listeners,Java,Arrays,Swing,Jlabel,Mouse Listeners,我创建了一个JLabels数组,它在java上是[9][9]。当我用鼠标点击这些标签时,我想将这些jlabel设置为可见。有人能帮我吗 I tried this: //labels[c][d].addMouseListener(null); public void mouseClicked(MouseEvent me){ // for(Integer i=1;i<10;i++) // { // for
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);
// }
// }
//
// }
使用如中所示的
在您的用例中,未选择的绿色图像将只是完全透明的图像,或者是所需BG颜色的图像
更具体的例子:
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);
}
});
}
}
请注意,按钮将对鼠标和键盘输入做出反应,而默认情况下标签不会做出反应。如果所有这些JLabel在开始时都不可见,则它们将无法捕获鼠标/按键事件。如果您希望仅在单击标签后显示标签内容,请不要在它们收到单击之前设置其文本,如下所示:
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 );
}
你发布的代码似乎并不坏。但您总是将标签设置为索引[1][1]可见,而不是使用[i][j] 当然,如果你的JLabel真的是MouseEvent的来源,你可以放弃整个循环机制,例如,如果你使用
me.getSource()==labels[i][j]
要确定需要设置为可见的标签,可以将整个双循环替换为
((JLabel)me.getSource()).setVisible( true );
我希望这有帮助
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);
}
}
使用您已创建Jlabel数组的代码编辑问题。这意味着有91个标签。这个呢?首先,不是91而是819*9=81。第二件事-您可以轻松地将我的示例中创建的所有JLabel保存到某个数组中。在示例中添加一些数组是没有意义的,因为问题不在于它,而在于可见性。