#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());
}
}