어제 저는 빠른 데스크탑 응용 프로그램을위한 스윙 (저는 실제로 swt 팬입니다 ...).어제 JPopupMenu 구분 기호 (GTK LaF) 및 항목 강조 표시
1) GTK 불화물이 구분이 due to a bug을 표시되지 않는으로 :
은 BTW 나는 JPopupMenu의 문제 몇 가지를 가로 질러왔다.2) 메뉴 항목 위로 마우스를 이동하는 동안, 그들은
어제 저는 빠른 데스크탑 응용 프로그램을위한 스윙 (저는 실제로 swt 팬입니다 ...).어제 JPopupMenu 구분 기호 (GTK LaF) 및 항목 강조 표시
1) GTK 불화물이 구분이 due to a bug을 표시되지 않는으로 :
은 BTW 나는 JPopupMenu의 문제 몇 가지를 가로 질러왔다.2) 메뉴 항목 위로 마우스를 이동하는 동안, 그들은
나는 위의 두 가지 문제를 해결하기 위해 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"));
여기 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);
}
});
}
}
항상 SSCCE와 함께 JSeparator를 보지 않아 얼마나 오래, 예를 들어 +1 해 주셔서 감사합니다. – mKorbel
그렇다면 아무런 문제가 없습니다. –
네, 맞습니다! 당신이 당신의 어플리케이션의 핵심에 집중하기를 원할 때 "화장품"문제에 시간을 할애하기 때문에 솔루션을 공유하기를 원했습니다. :) – lviggiani
['MouseAdapter'] (http://download.oracle. com/javase/7/docs/api/java/awt/event/MouseAdapter.html)를 사용하면 혼란을 줄일 수 있습니다. – trashgod