Java—一种无需鼠标侦听器就可以请求焦点集中在单击上的简单方法?

Java—一种无需鼠标侦听器就可以请求焦点集中在单击上的简单方法?,java,swing,focus,jcomponent,Java,Swing,Focus,Jcomponent,当你点击一个JComponent时,有没有比设置一个MouseListener更容易的方法来请求焦点呢?你可以从一个类继承,比如JLabel一个名为JFocusedLabel的类,这个类将有一个MouseListener,它将完成焦点。您可能需要实现5-6个这样的类,但最终您不必将这样的侦听器添加到您拥有的每个JComponent对象中。只需实例化这些类,而不是它们的标准父类。您需要向组件添加一个MouseListener,以便它能够响应鼠标按下并请求应用程序焦点。对多个组件执行此操作的最简单方

当你点击一个JComponent时,有没有比设置一个MouseListener更容易的方法来请求焦点呢?

你可以从一个类继承,比如
JLabel
一个名为
JFocusedLabel
的类,这个类将有一个
MouseListener
,它将完成焦点。您可能需要实现5-6个这样的类,但最终您不必将这样的侦听器添加到您拥有的每个
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.awt.Color;
导入java.awt.Dimension;
导入java.awt.GridLayout;
导入java.awt.event.FocusAdapter;
导入java.awt.event.FocusEvent;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入javax.swing.*;
导入javax.swing.border.border;
@抑制警告(“串行”)
公共类FocusTest扩展了JPanel{
私有静态最终整数行=6;
专用静态最终整数COLS=10;
保护静态最终内部厚度=5;
专用静态最终整数预值W=500;
私有静态最终整型参数H=300;
选择的专用静态最终颜色\u Color=Color.RED;
私有静态最终颜色未选择\u颜色=Color.LIGHT\u灰色;
公共焦点测试(){
setLayout(新的网格布局(行、列、2、2));
MyMouse MyMouse=新建MyMouse();
MyFocus MyFocus=新建MyFocus();
对于(int i=0;icreateAndShowGui());
}
}

为什么不使用鼠标听筒?您还可以如何设想您的应用程序会收到鼠标按下的通知?你想解决的总体问题是什么?你能展示相关的代码吗?我有很多非常简单的JComponents,它们会比鼠标侦听器需要的复杂得多,我希望JComponents库中有一个函数可以自动请求对点击事件的焦点,或者如果其他地方不需要的话,可以请求默认焦点。好的。这就是我问题的本质所在。谢谢你的帮助。是鼠标侦听器。不,它必须是鼠标侦听器。FocusListener可以使用制表符,但没有鼠标侦听器仍然无法捕获鼠标单击。