2010-04-19 55 views
2

我正在尝试将MouseMotion事件添加到标签,并基于鼠标的拖动将其移动,并使其随鼠标移动。但鼠标移动非常难以控制,从而使此操作无法使用。 下面是代码JTable中的MouseMotionListener

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.Is有一个简单的方法莫过于此。

+0

“附在桌子上”究竟意味着什么? – stacker 2010-04-19 12:29:41

回答

4

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

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

这已经有一段时间,因为我曾与鼠标事件而奋斗,但也许你可以试试这个,让我们知道如果有帮助。

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

+0

感谢它的工作..我们可以很容易地将标签添加到表中,并设置setOpaque(true); – Harish 2010-04-19 13:14:32