2010-04-19 3 views
2

MouseMotion 이벤트를 레이블에 추가하고 마우스 드래그를 기준으로 이동하여 마우스로 이동하려고합니다. 그러나 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

답변

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