2012-12-02 45 views
0

下面是我的JTable的内部JPanels在鼠标进入/退出时不会收到通知的简单示例。为什么?为什么我的JPanel在JTable中听不到鼠标改变?

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

    } 

} 

回答

2

渲染器组件意图为每个单元重复使用以提高性能。因此,制作panel,labelclose字段并且仅做label.setText(String,valueOf(value))

然后,将鼠标(运动)侦听器添加到组件往往没什么意义。请将它们添加到JTable中,并使用columnAtPoint rowAtPoint。

+0

您的回答很明确,但为什么向组件添加侦听器没有意义? – sdasdadas

+1

然后,单个组件实例仅用于绘制每个单元,并且不在表paint方法之外保留每个单元的状态:对getTableCellRendererComponent的调用将为每个单元的paint调用填充该状态。 –

+0

谢谢,这工作。 – sdasdadas

相关问题