2016-11-23 2 views
0

У меня есть 16 Jpanels, которые я хочу выделить, когда наведите указатель мыши на них. Я создал анонимно JPanels, а затем добавил их к родителям и добавил MouseListener для каждого из них. Затем я добавил родителя MouseListener. Дело в том, что теперь он просто выделяет родителя. Как я могу это исправить?Как я могу выделить JPanels при наведении мыши?

ПРИМЕЧАНИЕ: Иногда JFrame ничего не показывает - вам просто нужно продолжать работать, пока это не произойдет (обычно это занимает 2-3 попытки). Комментарий, если он еще не работает после> 5 попыток.

HighlightJPanels (создает JFrame, контейнер, и детей, и добавляет MouseListeners)

public class HighlightJPanels extends JFrame{ 
    private static final long serialVersionUID = 7163215339973706671L; 
    private static final Dimension containerSize = new Dimension(640, 477); 
    private JLayeredPane layeredPane; 
    static JPanel container; 

    public HighlightJPanels() { 
     super("Highlight Test"); 
     setSize(640, 477); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 
     setVisible(true); 

     layeredPane = new JLayeredPane(); 
     layeredPane.setPreferredSize(containerSize); 
     getContentPane().add(layeredPane); 

     createContainer(); 

     layeredPane.add(container, JLayeredPane.DEFAULT_LAYER); 

     createChildren(4, 4); 

     container.addMouseMotionListener(new HighlightJPanelsContainerMouseListener()); 
    } 

    private void createChildren(int columns, int rows){ 
     for (int i = 0; i < columns; i++){ 
      for (int j = 0; j < rows; j++){ 
       JPanel child = new JPanel(new BorderLayout()); 
       child.setBackground(Color.LIGHT_GRAY); 
       child.addMouseListener(new HighlightJPanelsMouseListeners()); 
       container.add(child); 
      } 
     } 
    } 

    private JPanel createContainer(){ 
     container = new JPanel(); 
     container.setLayout(createLayout(4, 4, 1, 1)); 
     container.setPreferredSize(containerSize); 
     container.setBounds(0, 0, containerSize.width, containerSize.height); 
     return container; 
    } 

    private GridLayout createLayout(int rows, int columns, int hGap, int vGap){ 
     GridLayout layout = new GridLayout(rows, columns); 
     layout.setHgap(hGap); 
     layout.setVgap(vGap); 
     return layout; 
    } 

    public static void main(String[] args) { 
     new HighlightJPanels(); 
    } 
} 

HighlightJPanelsChildMouseListeners (создает MouseListeners, которые будут добавлены к детям)

public class HighlightJPanelsChildMouseListeners implements MouseListener{ 
    private Border grayBorder = BorderFactory.createLineBorder(Color.DARK_GRAY); 

    public HighlightJPanelsChildMouseListeners() { 
    } 

    public void mouseEntered(MouseEvent e) { 
     Component comp = HighlightJPanels.container.findComponentAt(HighlightJPanelsContainerMouseListener.eX, HighlightJPanelsContainerMouseListener.eY); 
     JPanel parent = (JPanel) comp; 
     parent.setBorder(grayBorder); 
     parent.revalidate(); 
    } 

    public void mouseExited(MouseEvent e) { 
     Component comp = HighlightJPanels.container.findComponentAt(HighlightJPanelsContainerMouseListener.eX, HighlightJPanelsContainerMouseListener.eY); 
     JPanel parent = (JPanel) comp; 
     parent.setBorder(null); 
     parent.revalidate(); 
    } 

    public void mousePressed(MouseEvent e){} 
    public void mouseReleased(MouseEvent e){} 
    public void mouseClicked(MouseEvent e) {} 
} 

HighlightJPanelsContainerMouseListener (создает MouseListener, который будет добавить в контейнер)

public class HighlightJPanelsContainerMouseListener implements MouseMotionListener{ 
    static int eX; 
    static int eY; 

    public void mouseDragged(MouseEvent e) {} 

    public void mouseMoved(MouseEvent e) { 
     eX = e.getX(); 
     eY = e.getY(); 
    } 
} 
+0

Я бы рекомендовал использовать MouseListener над MouseMotionListener и реализации методов '' MouseEntered' и MouseExited' – ControlAltDel

+0

@ControlAltDel я сделать это в ** HighlightJPanelsChildMouseListeners **, но если бы я сделать это в ** ** HighlightJPanelsContainerMouseListener тогда он просто выделит родителя. –

ответ

3

Проблема была вызвана как найти JPanel выделить, на этой линии:

Component comp = HighlightJPanels.container.findComponentAt(HighlightJPanelsContainerMouseListener.eX, HighlightJPanelsContainerMouseListener.eY); 

К счастью, уже есть функция, которая будет делать то, что вы хотите , Вы можете просто использовать getSource() на мероприятии, и он расскажет вам, какую панель выделить. Таким образом, изменить свою функцию следующим образом:

public void mouseEntered(MouseEvent e) { 
    JPanel parent = (JPanel)e.getSource(); 
    parent.setBorder(grayBorder); 
    parent.revalidate(); 
} 

и делать то же самое с mouseExited, и вы увидите, что выбрать правильную панель. И это устранит необходимость в HighlightJPanelsContainerMouseListener.

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