MouseEntered and KeyPressed at Same Time Java Swing

前端 未结 2 934
梦谈多话
梦谈多话 2021-01-21 22:50

Using Java Swing I have 20 JLabels. Each JLabel has a MouseListener and a KeyListener. I\'m been trying to come up with a way

2条回答
  •  不思量自难忘°
    2021-01-21 23:26

    Suggestions that might surprise you:

    • Surprise number 1: Don't use a MouseListener
    • Surprise number 2: Don't use a MouseMotionListener.
    • Surprise number 3: Don't use KeyListeners.
    • Instead use Key Bindings (tutorial here: Key Bindings Tutorial). I suggest that you bind the delete key press on the JPanel that holds your grid of JLabel. Then when the delete key has been pressed, find out which JLabel the cursor is over (if any) by using the MouseInfo class to get a PointerInfo instance, and with that get the location of the cursor on the screen. With that information and some trivial math, it should be easy for you to figure out which label has the cursor (again, if any), and do your appropriate action. Note that the Key Bindings tutorial will tell you why its better to use these rather than KeyListeners, but most importantly, you don't have to futz so much with the application's focus.

    Edit For example:

    import java.awt.Component;
    import java.awt.GridLayout;
    import java.awt.MouseInfo;
    import java.awt.Point;
    import java.awt.PointerInfo;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    
    import javax.swing.*;
    
    @SuppressWarnings("serial")
    public class BindingExample extends JPanel {
       private static final int ROWS = 10;
       private static final int COLS = 8;
       JLabel[][] labels = new JLabel[ROWS][COLS];
    
       public BindingExample() {
          setLayout(new GridLayout(ROWS, COLS));
          for (int r = 0; r < labels.length; r++) {
             for (int c = 0; c < labels[r].length; c++) {
                String labelText = String.format("[%d,  %d]", r, c);
                labels[r][c] = new JLabel(labelText, SwingConstants.CENTER);
                int eb = 4;
                labels[r][c].setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb));
                add(labels[r][c]);
             }
          }
    
          int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
          InputMap inputMap = getInputMap(condition);
          ActionMap actionMap = getActionMap();
    
          KeyStroke delKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);
          String delete = "delete";
    
          inputMap.put(delKeyStroke, delete);
          actionMap.put(delete, new DeleteAction());
       }
    
       private class DeleteAction extends AbstractAction {
          @Override
          public void actionPerformed(ActionEvent evt) {
             PointerInfo pInfo = MouseInfo.getPointerInfo();
             Point ptOnScrn = pInfo.getLocation();
             int xPanel = getLocationOnScreen().x;
             int yPanel = getLocationOnScreen().y;
             int x = ptOnScrn.x - xPanel;
             int y = ptOnScrn.y - yPanel;
    
             Component component = getComponentAt(x, y);
             if (component != null) {
                JLabel selectedLabel = (JLabel) component;
                System.out.println("Selected Label: " + selectedLabel.getText());
             }
          }
       }
    
       private static void createAndShowGui() {
          BindingExample mainPanel = new BindingExample();
    
          JFrame frame = new JFrame("Key Bindings Example");
          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    

    Edit 2
    Shoot, just saw the comments to your question, and yeah, a JList would probably be much better for your purposes.

提交回复
热议问题