Исправление разделителей JPopupMenu (GTK LaF) и выделения элементов - PullRequest
1 голос
/ 31 августа 2011

вчера я впервые использовал Swing для быстрого настольного приложения (я действительно фанат SWT ...).

Кстати, я столкнулся с парой проблем с JPopupMenu:

1) В GTK LaF разделители не отображаются из-за ошибки .

2) При наведении мыши на пункты меню они не подсвечиваются (видно наlinux и выиграй)

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Вот вариант с использованием 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);
            }
        });
    }
}
1 голос
/ 31 августа 2011

Я решил расширить класс 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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...