Java 固定JPOPUPMENUS分隔符(GTK LaF)和项目突出显示
昨天,我第一次使用Swing开发了一个快速桌面应用程序(我确实是swt的粉丝…) 顺便说一句,我在使用JPOppMenu时遇到了几个问题: 1) 对于GTK LaF,分离器不显示Java 固定JPOPUPMENUS分隔符(GTK LaF)和项目突出显示,java,swing,popup,Java,Swing,Popup,昨天,我第一次使用Swing开发了一个快速桌面应用程序(我确实是swt的粉丝…) 顺便说一句,我在使用JPOppMenu时遇到了几个问题: 1) 对于GTK LaF,分离器不显示 2) 当将鼠标移到菜单项上时,它们不会突出显示(在linux和win上看到)我决定扩展JPopupMenu类以解决上述两个问题,现在我只想共享代码,以防有人面临同样的问题 import java.awt.Dimension; import java.awt.event.MouseEvent; import java.a
2) 当将鼠标移到菜单项上时,它们不会突出显示(在linux和win上看到)我决定扩展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"));
这是一个使用的变体,也是一个供将来参考的变体
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);
}
});
}
}
所以这是毫无疑问的,对吗?是的,你是对的!我只是想和大家分享一个解决方案,因为有时候你需要花几个小时来解决“表面”问题,而你却想专注于应用程序的核心…:)考虑使用来减少杂乱。@ TrasVald,这是SaleStAppyMod之一,因为我是RouWestHyyMyLoad的追随者,这个SEFL答案是真的,非常好,非常好:-)MkBoel:啊,我忘了;如果将Java与
GTKLookAndFeel
@trashgood一起使用,我从问题中得出了答案,以符合标准堆栈溢出样式。lviggiani,别忘了你可以通过点击绿色复选标记来接受你自己的答案。始终使用SSCCE,我多长时间没有看到JSepator,谢谢示例+1