2011-08-31 2 views
1

어제 저는 빠른 데스크탑 응용 프로그램을위한 스윙 (저는 실제로 swt 팬입니다 ...).어제 JPopupMenu 구분 기호 (GTK LaF) 및 항목 강조 표시

1) GTK 불화물이 구분이 due to a bug을 표시되지 않는으로 :

은 BTW 나는 JPopupMenu의 문제 몇 가지를 가로 질러왔다.

2) 메뉴 항목 위로 마우스를 이동하는 동안, 그들은

+0

그렇다면 아무런 문제가 없습니다. –

+0

네, 맞습니다! 당신이 당신의 어플리케이션의 핵심에 집중하기를 원할 때 "화장품"문제에 시간을 할애하기 때문에 솔루션을 공유하기를 원했습니다. :) – lviggiani

+0

['MouseAdapter'] (http://download.oracle. com/javase/7/docs/api/java/awt/event/MouseAdapter.html)를 사용하면 혼란을 줄일 수 있습니다. – trashgod

답변

1

나는 위의 두 가지 문제를 해결하기 위해 JPopupMenu의 클래스를 확장하기로 결정 (리눅스에서 볼 승리) 강조하지 않고 지금은 단지 공유 할 누군가가 똑같은 문제에 직면 할 경우를 대비해 코드.

import java.awt.Dimension; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JMenuItem; 
import javax.swing.JPopupMenu; 
import javax.swing.JSeparator; 

public class JPopupMenuEx 
extends JPopupMenu 
implements MouseListener { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -5352058505305990803L; 

    @Override 
    public void addSeparator() { 
     add(new JSeparatorEx()); 
    } 

    @Override 
    public JMenuItem add(JMenuItem menuItem) { 
     menuItem.addMouseListener(this); 
     return super.add(menuItem); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     ((JMenuItem)e.getSource()).setArmed(true); 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     ((JMenuItem)e.getSource()).setArmed(false); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) {} 

    @Override 
    public void mousePressed(MouseEvent e) {} 

    @Override 
    public void mouseReleased(MouseEvent e) {} 

    public class JSeparatorEx extends JSeparator{ 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 3477309905456341629L; 

     public Dimension getPreferredSize() { 
      Dimension d = super.getPreferredSize(); 

      if (d.height==0) 
       d.height = 4; 

      return d; 
     } 
    } 
} 

그래서 당신은 다음과 같이 JPopupMenu의를 사용하여 다음과 같이 사용할 수 있습니다

JPopupMenuEx popup = new JPopupMenuEx(); 
popup.add(new JCheckBoxMenuItem("Item 1")); 
popup.addSeparator(); 
popup.add(new JMenuItem("Item 2")); 
+0

@trashgod 이것은 내가 RouwdiesHappyMode의 추종자이기 때문에 SilentHappyMode 중 하나입니다.이 sefl-answer는 정말 좋고 아주 좋았습니다 :-) – mKorbel

+0

@mKorbel : 아, 잊어 버렸습니다. 당신은'GTKLookAndFeel'과 함께 자바를 사용합니다. – trashgod

+1

@trashgod, 표준 스택 오버플로 스타일에 맞게 질문에서 답을 찾아 냈습니다. lviggiani, 녹색 체크 표시를 클릭하여 답변을 수락 할 수 있다는 것을 잊지 마십시오. –

1

여기 MouseAdapter을 사용하여 변형뿐만 아니라, 미래를 참조 할 수 sscce입니다.

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 

/** @see http://stackoverflow.com/questions/7254488 */ 
public class JPopupMenuEx extends JPopupMenu { 

    private MouseAdapter mouseListener = new MouseAdapter() { 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      ((JMenuItem) e.getSource()).setArmed(true); 
     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      ((JMenuItem) e.getSource()).setArmed(false); 
     } 
    }; 

    @Override 
    public void addSeparator() { 
     add(new JSeparatorEx()); 
    } 

    @Override 
    public JMenuItem add(JMenuItem menuItem) { 
     menuItem.addMouseListener(mouseListener); 
     return super.add(menuItem); 
    } 

    private static class JSeparatorEx extends JSeparator { 

     @Override 
     public Dimension getPreferredSize() { 
      Dimension d = super.getPreferredSize(); 
      if (d.height == 0) { 
       d.height = 4; 
      } 
      return d; 
     } 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JPopupMenuEx popup = new JPopupMenuEx(); 
       popup.add(new JCheckBoxMenuItem("Item 1")); 
       popup.addSeparator(); 
       popup.add(new JMenuItem("Item 2")); 
       JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       JPanel p = new JPanel(); 
       p.add(new JLabel("Right click for context menu.")); 
       p.setComponentPopupMenu(popup); 
       f.add(p); 
       f.pack(); 
       f.setLocationRelativeTo(null); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+0

항상 SSCCE와 함께 JSeparator를 보지 않아 얼마나 오래, 예를 들어 +1 해 주셔서 감사합니다. – mKorbel