Проблема навигации во всплывающем окне и как использовать setLocationRelativeTo()

#java #swing #jpopupmenu

Вопрос:

У меня есть JButton имя Graphics :

введите описание изображения здесь

Когда я нажимаю на нее, появляется новое всплывающее меню, и пользователь выбирает разрешение экрана:

введите описание изображения здесь

Я добавил пользовательские изображения в пункты меню, я не могу перейти ни к одному из пунктов меню с помощью клавиш со стрелками.

Вторая проблема заключается в том, что всплывающее меню не помещается в рамку, пожалуйста, дайте мне знать, как сделать так, чтобы оно отображалось внутри JFrame или на графической кнопке.

Я пробовал KeyListener, но это не сработало.

В следующем коде я создал JPopupMenu и инициализировал его, а в KeyListener функции я попытался решить проблему навигации, но это не сработало.

 popgraphics=new JPopupMenu();
JMenuItem p1920=new JMenuItem();
JMenuItem p1536=new JMenuItem();
JMenuItem p1280=new JMenuItem();
p1920.setIcon(new ImageIcon(getClass().getResource("icons\1920p.png")));
p1536.setIcon(new ImageIcon(getClass().getResource("icons\1536p.png")));
p1280.setIcon(new ImageIcon(getClass().getResource("icons\1280p.png")));
p1920.setBorder(b1);
// p1920.setText("1920x1080 Pixels");
// p1536.setText("1536x1440 Pixels");
// p1280.setText("1280x720 Pixels");

p1920.setFont(new Font("MV Boli",0,14));
p1536.setFont(new Font("MV Boli",0,14));
p1280.setFont(new Font("MV Boli",0,14));

p1920.setOpaque(false);
p1536.setOpaque(false);
p1536.setOpaque(false);

// popgraphics.setSelected(null);
// popgraphics.setSelectionModel(SingleSelectionModel);
popgraphics.addKeyListener(new KeyListener()
{

    @Override
    public void keyTyped(KeyEvent e) {
        if(e.getKeyChar()==(char)38)
        {
            if(popgraphics.getSelectionModel().getSelectedIndex()==1)
            {
                popgraphics.getSelectionModel().setSelectedIndex(3);
            }
            else if(popgraphics.getSelectionModel().getSelectedIndex()==2)
            {
                popgraphics.getSelectionModel().setSelectedIndex(1);
            }
            else if(popgraphics.getSelectionModel().getSelectedIndex()==3)
            {
                popgraphics.getSelectionModel().setSelectedIndex(2);
            }
        }
        if(e.getKeyChar()==(char)40)
        {
            if(popgraphics.getSelectionModel().getSelectedIndex()==1)
            {
                popgraphics.getSelectionModel().setSelectedIndex(2);
            }
            else if(popgraphics.getSelectionModel().getSelectedIndex()==2)
            {
                popgraphics.getSelectionModel().setSelectedIndex(3);
            }
            else if(popgraphics.getSelectionModel().getSelectedIndex()==3)
            {
                popgraphics.getSelectionModel().setSelectedIndex(1);
            }
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyChar()==(char)38)
        {
            if(popgraphics.getSelectionModel().getSelectedIndex()==1)
            {
                popgraphics.getSelectionModel().setSelectedIndex(3);
            }
            else if(popgraphics.getSelectionModel().getSelectedIndex()==2)
            {
                popgraphics.getSelectionModel().setSelectedIndex(1);
            }
            else if(popgraphics.getSelectionModel().getSelectedIndex()==3)
            {
                popgraphics.getSelectionModel().setSelectedIndex(2);
            }
        }
        if(e.getKeyChar()==(char)40)
        {
            if(popgraphics.getSelectionModel().getSelectedIndex()==1)
            {
                popgraphics.getSelectionModel().setSelectedIndex(2);
            }
            else if(popgraphics.getSelectionModel().getSelectedIndex()==2)
            {
                popgraphics.getSelectionModel().setSelectedIndex(3);
            }
            else if(popgraphics.getSelectionModel().getSelectedIndex()==3)
            {
                popgraphics.getSelectionModel().setSelectedIndex(1);
            }
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
});

popgraphics.add(p1280);
popgraphics.add(p1536);
popgraphics.add(p1920);
Point p=graghics.getLocation();
popgraphics.setLocation(p);
popgraphics.setBackground(new Color(20,20,20));
popgraphics.setOpaque(false);
 

Дайте мне знать, если потребуется какая-либо другая информация.

Комментарии:

1. Абра, которую я отредактировал, я могу еще раз объяснить вам , что у меня есть 2 проблемы, во-первых , переход к пунктам меню после добавления значков в качестве элементов меню, а во-вторых, я не могу создать меню Jpopup в Jframe, например, когда я сворачиваю или перемещаю кадр, всплывающее меню показывает перемещение с кадром.

2. Абра Я новичок в Stackoverflow , я не в состоянии понять, о чем вы меня просите.

3. Я прочитал ссылку и вроде как попытался изложить свою проблему, пожалуйста, помогите, если у вас есть моя проблема.

4. Этот кейлистер должен быть удален. Никто не должен явно управлять навигацией по клавиатуре в JPopupMenu. Одна вещь, которая отсутствует в вашем коде, — это фактическое отображение JPopupMenu. Единственный правильный способ отображения JPopupMenu-использовать его show метод (или передать его в setComponentPopupMenu, чтобы он отображался автоматически). Если вы явно добавляете свой JPopupMenu к родителю, это объяснило бы ваши трудности.

Ответ №1:

Вот простая программа, которая отображает a JButton с большим значком. A JPopupMenu подключен к JButton . JPopupMenu Содержит два JMenuItem , где у каждого из них есть свой собственный отдельный значок. Запустите программу. Наведите указатель мыши на JButton . Поднимите этот JPopupMenu вопрос . (На моем компьютере с Windows 10 я нажимаю правую кнопку мыши, чтобы отобразить JPopupMenu .) Затем нажмите клавишу со стрелкой вниз на клавиатуре.

 import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;

public class PopupTst {

    private void createAndDisplayGui() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Icon ico = new ImageIcon("first icon"); // replace with actual path to icon.
        JButton button = new JButton(ico);

        JPopupMenu popup = new JPopupMenu();
        Icon ico2 = new ImageIcon("second icon"); // replace with actual path to icon.
        JMenuItem one = new JMenuItem(ico2);
        popup.add(one);
        Icon ico3 = new ImageIcon("third icon"); // replace with actual path to icon.
        JMenuItem two = new JMenuItem(ico3);
        popup.add(two);

        button.setComponentPopupMenu(popup);

        frame.add(button);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        PopupTst instance = new PopupTst();
        EventQueue.invokeLater(() -> instance.createAndDisplayGui());
    }
}