2012-12-02 3 views
0

Вот простой пример внутренних JPanels моего JTable, который не уведомляется, когда мышь входит/выходит. Зачем?Почему моя 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, label и close полями и просто сделайте label.setText(String,valueOf(value)).

И тогда часто не имеет смысла добавлять мышь (движение) слушателей к компоненту. Вместо этого добавьте их в JTable и используйте columnAtPoint, rowAtPoint.

+0

Ваш ответ ясен, но почему нет смысла добавлять слушателя к компоненту? – sdasdadas

+1

Экземпляр одного компонента затем используется только для рисования каждой ячейки и не содержит никакого состояния для каждой ячейки за пределами метода рисования таблиц: вызов getTableCellRendererComponent заполняет это состояние на вызов краски ячейки. –

+0

Спасибо, это сработало. – sdasdadas

Смежные вопросы