2012-05-02 1 views
0

Я создаю массив JLabels, который является [9] [9] на java. и я хочу установить видимые эти JLabels, когда я щелкнул мышью на этих ярлыках. Кто-нибудь может мне помочь?Мышь щелкните по массиву JLabel (Java)

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); 
    //    } 
    //   } 
    //  
    // } 
+0

редактировать вопрос с кодом вы пытались –

+0

нормально, я так начинающий :) – ademcu

ответ

3

Используйте JToggleButton, как показано на Swing JToolbarButton pressing.

В вашем потребительном случае зеленый невыбранное изображения будет просто либо полностью прозрачное изображение или изображение, которое является желаемым цветом BG.

Более конкретный пример:

Toggle Image

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); 
      } 
     }); 
    } 
} 

Обратите внимание, что кнопка будет реагировать на как мыши и клавиатуры ввода, в то время как (по умолчанию) метка не будет.

2

Если все эти JLabels невидимы в начале - они не смогут поймать события мыши/клавиши. Если вы хотите показать метки контента только после нажатия на них - просто не установить их текст, прежде чем они Получать щелчок, как это:

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); 
} 
+0

я создать массив JLabel. это означает, что существует 91 ярлык. Как насчет этого? – ademcu

+0

Прежде всего, не 91, а 81 (9 * 9 = 81). Во-вторых, вы можете легко сохранить все созданные JLabels из моего примера в некоторый массив. Было просто бессмысленно добавлять некоторый массив в пример, так как вопрос не об этом, а о видимости. –

2

код вы вывесили, кажется, не плохо. Но вы всегда устанавливаете ярлык с индексом [1][1], а не с помощью [i][j].

И, конечно, если ваш JLabel действительно является источником MouseEvent, вы можете вытолкнуть весь механизм зацикливания, например. если вы используете

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

, чтобы определить, какой ярлык вам нужно установить видимый, вы можете заменить всю двойную петлю на

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

Я надеюсь, что это помогает.

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); 
    } 
} 
+1

'COLUMBS' ->' COLUMNS';) –

Смежные вопросы