Java JTable中的MouseMotionListener

Java JTable中的MouseMotionListener,java,swing,jtable,mouseevent,Java,Swing,Jtable,Mouseevent,我正在尝试将MouseMotion事件添加到标签中,并根据鼠标的拖动移动它,使其与鼠标一起移动。但是,MouseMotion很难控制,因此此操作不可用。 这是密码 import java.awt.Color; import java.awt.Component; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.BorderFactory; import

我正在尝试将MouseMotion事件添加到标签中,并根据鼠标的拖动移动它,使其与鼠标一起移动。但是,MouseMotion很难控制,因此此操作不可用。 这是密码

import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TableTest
{
    public TableTest()
    {
        String[] columnNames =
        { "FileName", "Integer" };
        Object[][] data =
        {
        { new FileName("AAA.jpg", Color.YELLOW), new Integer(2) },
        { new FileName("BBB.png", Color.GREEN), new FileName("BBB.png", Color.GREEN) },
        { new FileName("CCC.jpg", Color.RED), new Integer(-1) }, };
        DefaultTableModel model = new DefaultTableModel(data, columnNames)
        {
            public Class getColumnClass(int column)
            {
                System.out.println("column is" + column);
                return getValueAt(0, column).getClass();
            }
        };
        JTable table = new JTable(model);
        //JTable table = new JTable(data, columnNames);
        table.setDefaultRenderer(FileName.class, new FileNameCellRenderer());
        final JLabel label = new JLabel("TESTING", SwingConstants.CENTER);

        label.setBackground(java.awt.Color.RED);
        label.setBounds(450, 100, 90, 20);
        label.setOpaque(true);
        label.setVisible(true);

        label.addMouseMotionListener(new MouseMotionListener()
        {

            public void mouseDragged(MouseEvent arg0)
            {
                label.setBounds(arg0.getX(), arg0.getY(), 90, 20);

            }

            public void mouseMoved(MouseEvent arg0)
            {
                // TODO Auto-generated method stub

            }

        });
        table.add(label);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(table);
        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    static class FileNameCellRenderer extends DefaultTableCellRenderer
    {
        public Component getTableCellRendererComponent(JTable table, Object v,
                boolean isSelected, boolean hasFocus, int row, int column)
        {
            super.getTableCellRendererComponent(table, v, isSelected, hasFocus,
                    row, column);
            FileName fn = (FileName) v;
            setBorder(BorderFactory.createMatteBorder(0, 60, 0, 0,
                    new java.awt.Color(143, 188, 143)));
            return this;
        }
    }

    static class FileName
    {
        public final Color color;

        public final String label;

        FileName(String l, Color c)
        {
            this.label = l;
            this.color = c;
        }

        public String toString()
        {
            return label;
        }
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new TableTest();
            }
        });
    }
}

我只想让标签跟随我的鼠标,标签应该贴在桌子上。有没有比这更简单的方法。

首先,我认为您使用鼠标事件坐标(x,y)的方式不正确,因为它们是相对于源组件的。在这种情况下,源是标签本身。因此,您应该将源组件的原始值(x,y)添加到这些值中:

label.setBounds(label.getX() + arg0.getX(), label.getY() + arg0.getY(),90,20);
我已经有一段时间没有处理鼠标事件了,但是也许你可以试试这个,如果有帮助的话,告诉我们


另一件我不确定的事情是在JTable中添加标签。JTable的LayoutManager可能会阻止您以这种方式实际实现,您可能需要使用GlassPane或桌面上的其他东西。

什么是“附加到表”的确切含义?感谢它的工作。我们可以通过这种方式轻松地将标签添加到表中,并设置setObque(true);