java - 为什么我的 JPanel 在 JTable 内听不到鼠标变化?

标签 java swing jtable mouseevent renderer

这是一个简单的示例,当鼠标进入/退出时,我的 JTable 的内部 JPanel 不会收到通知。为什么?

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

import net.miginfocom.layout.CC;
import net.miginfocom.swing.MigLayout;


public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel(new MigLayout("debug"));

        // JTABLE
        String[] columnNames = {"First Name",
                "Last Name",
                "Sport",
                "# of Years",
                "Vegetarian"};
        Object[][] data = {
                {"Kathy", "Smith",
                 "Snowboarding", new Integer(5), new Boolean(false)},
                {"John", "Doe",
                 "Rowing", new Integer(3), new Boolean(true)},
                {"Sue", "Black",
                 "Knitting", new Integer(2), new Boolean(false)},
                {"Jane", "White",
                 "Speed reading", new Integer(20), new Boolean(true)},
                {"Joe", "Brown",
                 "Pool", new Integer(10), new Boolean(false)}
            };


        JTable table = new JTable(data, columnNames);
        table.setDefaultRenderer(String.class, new TableCellRenderer() {

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
                JPanel panel = new JPanel(new MigLayout("fill"));

                JLabel label = new JLabel(value.toString());
                label.setFont(new Font("SansSerif", Font.PLAIN, 13));
                label.setHorizontalAlignment(JLabel.CENTER);
                panel.add(label, new CC().growY());

                final JLabel close = new JLabel(" x ");
                close.setHorizontalAlignment(JLabel.CENTER);
                close.setVerticalAlignment(JLabel.CENTER);
                panel.add(close, new CC().growY().alignX("right"));

                panel.addMouseListener(new MouseAdapter() {

                    @Override
                    public void mouseEntered(MouseEvent event) {
                        System.out.println("CALLED");
                        close.setForeground(Color.red);
                    }

                    @Override
                    public void mouseExited(MouseEvent event) {
                        System.out.println("GRR");
                        close.setForeground(Color.black);
                    }

                });

                return panel;
            }

        });

        panel.add(table, new CC().width("50%"));

        frame.setContentPane(panel);

        frame.pack();
        frame.setVisible(true);

    }

}

最佳答案

渲染器组件旨在为每个单元重复使用,以提高性能。因此,制作 panellabelclose 字段,只需执行 label.setText(String,valueOf(value)).

然后,向组件添加鼠标(运动)监听器通常没有多大意义。 相反,将它们添加到 JTable 并使用 columnAtPoint , rowAtPoint。

关于java - 为什么我的 JPanel 在 JTable 内听不到鼠标变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675251/

相关文章:

java - 将图像添加到 JButton

java - 默认 Maven 编译器设置

java - 在 java 中读取图像时出现 IllegalArgumentException

java - 将选定的 Jtree 节点设置为 JTable

java - 学习 Spring MVC 的资源

java - 将 JFrame 信息发送到打印机

java - JTextPane 中第一个字母左侧的意外填充/意外排版行为

java - 如何设置JtabbedPane选项卡中Jtable的大小以及如何设置JTabbedPane中选项卡的布局?

java - 如何在java中的 ListView 中绑定(bind)arraylist

java - 如何在程序运行时用另一个 JPanel 替换