gpt4 book ai didi

java - JTable 中的 MouseMotionListener

转载 作者:行者123 更新时间:2023-11-30 07:37:26 25 4
gpt4 key购买 nike

我正在尝试将 MouseMotion 事件添加到标签,并根据鼠标的拖动来移动它,并使其随鼠标一起移动。但是,鼠标 Action 很难控制,因此无法使用此操作。这是代码

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();
}
});
}
}

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

最佳答案

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

label.setBounds(label.getX() + arg0.getX(), label.getY() + arg0.getY(),90,20);

自从我不得不与鼠标事件作斗争以来已经有一段时间了,但也许你可以试试这个,如果它有帮助,请告诉我们。

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

关于java - JTable 中的 MouseMotionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2666940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com