gpt4 book ai didi

java - 如何重写JPopupMenu的show方法?

转载 作者:行者123 更新时间:2023-12-02 04:46:14 25 4
gpt4 key购买 nike

我的目标是右键单击后突出显示 jlist 项目,然后显示 jpopupmenu..我读到的建议是重写方法显示。就我而言,我在类(class)开始时声明我的 jpopupmenu

     JPopupMenu popupMenu = new JPopupMenu();
JMenuItem masterlist,settings;

然后我有一个方法来设置我的菜单项

    public void setPopupMenu(int depth//ignore this var){
//popupMenu = new JPopupMenu();
popupMenu.removeAll();

masterlist = new JMenuItem("Masterlist");
settings = new JMenuItem("Settings");

//action for marsterlist
masterlist.addActionListener(new ActionListener(){
//stuff here
}
});
//action for settings
settings.addActionListener(new ActionListener(){
//stuff here
}
});

popupMenu.add(masterlist);
popupMenu.add(settings);
}

我的列表采用了不同的方法

list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
list.setVisibleRowCount(-1);
list.setComponentPopupMenu(popupMenu);

我尝试将其放在列表的 mouseAdapter 上,但弹出菜单首先触发并忽略突出显示...

   if ( SwingUtilities.isRightMouseButton(mouseEvent) )//highlight the right clicked item
{

int row = list.locationToIndex(mouseEvent.getPoint());
list.setSelectedIndex(row);
String val = (String)list.getSelectedValue();
System.out.println(val);
}

我知道重写是这样的

  popupmenu = new JPopupMenu(){
@Override
public void show(){}
}

但我不能这样做,因为我正在操作方法上的菜单项...或者还有其他任何人都可以建议的方法...

最佳答案

与其尝试修改 JPopupMenu 的状态,为什么不简单地在检测到右键单击时修改菜单项的状态...

JList with right mouse selection and popup

所以,基本上,我使用 Actions APIJPopupMenu 定义菜单项,这允许它向底层 JList 注册 ListSelectionListener...

public class ShowItemAction extends AbstractAction {

private JList list;

public ShowItemAction(JList list) {
this.list = new JList();
putValue(NAME, "Showing ...");

list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
int index = list.getSelectedIndex();
String value = list.getSelectedValue().toString();
putValue(NAME, "Showing " + value + " @ " + index);
}
}
});
}

@Override
public void actionPerformed(ActionEvent e) {
// The actual action to be performed when selected
}

}

这一切的作用是,当选择更改时,更改操作的文本 (NAME),这会根据当前选定的行更改菜单项的文本。

当我创建JList时,我通过setComponentPopupMenu方法为其分配一个JPopupMenu,这意味着我不再需要关心它并将根据当前的外观要求适当显示

JList list = new JList(model);
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(new ShowItemAction(list));
list.setComponentPopupMenu(popupMenu);

然后,我将一个 MouseListener 添加到 JList 中,当您右键单击 JList 时,我用它来更改行选择...

list.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
JList list = (JList)e.getComponent();
if (SwingUtilities.isRightMouseButton(e)) {
int row = list.locationToIndex(e.getPoint());
list.setSelectedIndex(row);
}
}
});

这并不完全是万无一失的,就像在弹出窗口可见时右键单击 JList 一样,MouseListener 似乎不会收到通知:P

可运行的示例...

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractAction;
import static javax.swing.Action.NAME;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Test {

public static void main(String[] args) {
new Test();
}

public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

DefaultListModel model = new DefaultListModel();
model.addElement("One");
model.addElement("Two");
model.addElement("Three");
model.addElement("Four");
JList list = new JList(model);
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(new ShowItemAction(list));
list.setComponentPopupMenu(popupMenu);

list.addMouseListener(new MouseAdapter() {

@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)) {
int row = list.locationToIndex(e.getPoint());
list.setSelectedIndex(row);
}
}

});

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(list));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class ShowItemAction extends AbstractAction {

private JList list;

public ShowItemAction(JList list) {
this.list = new JList();
putValue(NAME, "Showing ...");

list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
int index = list.getSelectedIndex();
String value = list.getSelectedValue().toString();
putValue(NAME, "Showing " + value + " @ " + index);
}
}
});
}

@Override
public void actionPerformed(ActionEvent e) {
}

}

}

关于java - 如何重写JPopupMenu的show方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29639875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com