2016-11-23 13 views
0

マウスの上にマウスを置いたときにハイライト表示される16個のJpanelsがあります。私はJPanelを匿名で作成し、それを親に追加し、それぞれにMouseListenerを追加しました。私は親にMouseListenerを追加しました。事は、今は親を強調表示するだけです。これをどうすれば解決できますか?マウスのホバーでJPanelを強調表示するにはどうすればよいですか?

注:場合によってはJFrameに何も表示されない場合があります(通常は2-3回の試行が必要です)。 5回以上試行してもまだ動作していない場合はコメントしてください。

HighlightJPanels(JFrameの、容器、および子供を作成し、のMouseListenerを追加)

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(子供に追加されるのMouseListenerを作成)

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) {} 
} 

ハイライトJPanelsContainerMouseListener(MouseListenerを作成します。問題は、この行に、あなたが強調表示するJPanelを見つける方法によって引き起こされている

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

私は、その** HighlightJPanelsChildMouseListenersで**、しかし私はそれを行うとしたら** HighlightJPanelsContainerMouseListener **のMouseMotionListener上のMouseListenerを使用してMouseExited' – ControlAltDel

+0

@ControlAltDelは私がやったの ''メソッドを実装MouseEntered'とお勧めしますそれは単に親を強調表示します。 –

答えて

3

)コンテナに追加する:幸いにも

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の必要性が排除されます。

関連する問題