Java - 在没有鼠标监听器的情况下请求关注点击的简单方法?

标签 java swing focus jcomponent

有没有比必须设置 MouseListener 更简单的方法让 JComponent 在您单击它时请求焦点?

最佳答案

您需要向组件添加一个 MouseListener,以便它能够响应鼠标按下并请求应用程序焦点。对多个组件执行此操作的最简单方法是使用循环,例如在创建组件时使用的 for 循环,或者将组件放在 ArrayList 等容器中,并循环遍历此集合,添加 MouseListener (MouseAdapter)。例如:

private class MyMouse extends MouseAdapter {
    @Override
    public void mousePressed(MouseEvent e) {
        JComponent comp = (JComponent) e.getSource();
        comp.requestFocusInWindow();
    }
}

可以这样使用:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.border.Border;

@SuppressWarnings("serial")
public class FocusTest extends JPanel {

    private static final int ROWS = 6;
    private static final int COLS = 10;
    protected static final int THICKNESS = 5;
    private static final int PREF_W = 500;
    private static final int PREF_H = 300;
    private static final Color SELECTED_COLOR = Color.RED;
    private static final Color UNSELECTED_COLOR = Color.LIGHT_GRAY;

    public FocusTest() {
        setLayout(new GridLayout(ROWS, COLS, 2, 2));
        MyMouse myMouse = new MyMouse();
        MyFocus myFocus = new MyFocus();
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                String text = String.format("[%d, %d]", j, i);
                final JLabel label = new JLabel(text, SwingConstants.CENTER);
                label.setBorder(createBorder(false));
                label.addFocusListener(myFocus);
                label.addMouseListener(myMouse);
                label.setFocusable(true);
                add(label);
            }
        }
    }

    public Border createBorder(boolean selected) {
        Color color = selected ? SELECTED_COLOR : UNSELECTED_COLOR;
        return BorderFactory.createLineBorder(color, THICKNESS);
    }

    private class MyMouse extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            JComponent comp = (JComponent) e.getSource();
            comp.requestFocusInWindow();
        }
    }

    private class MyFocus extends FocusAdapter {

        @Override
        public void focusGained(FocusEvent e) {
            JComponent comp = (JComponent) e.getSource();
            comp.setBorder(createBorder(true));
        }

        @Override
        public void focusLost(FocusEvent e) {
            JComponent comp = (JComponent) e.getSource();
            comp.setBorder(createBorder(false));
        }
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension superSize = super.getPreferredSize();
        if (isPreferredSizeSet()) {
            return superSize;
        }
        int w = Math.max(PREF_W, superSize.width);
        int h = Math.max(PREF_H, superSize.height);
        return new Dimension(w, h);
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("FocusTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new FocusTest());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

关于Java - 在没有鼠标监听器的情况下请求关注点击的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47241157/

相关文章:

java - 导航到特定的 JSON 节点并使用 ObjectMapper

java - 我怎样才能让两个类共享相同的变量定义

javascript - 如何进行现场自动对焦?

java - 为什么这些图像不显示?

java - 如何从 JPanel swing 更改 JFrame 标签

ios - 具有焦点状态的 CSS 后代选择器在 iOS 中不起作用

android - 在 Horizo​​ntal ScrollView 中滚动会失去焦点元素的焦点,

java - 如何删除 Windows NTFS 文件系统中的 Thumbs.db 文件?

java - 不能引用非最终变量和计时器

java - 提供与 @Inject 注释一起使用的注入(inject)的最简单方法是什么?