当前位置: 首页 > 知识库问答 >
问题:

获取JList中选定元素的位置

江煜
2023-03-14

有可能在JList中获得所选元素的位置吗?我想让它将JFrame放在单击选项的正下方。

共有2个答案

松昱
2023-03-14

你可以使用 JListindexToLocation() 方法,例如:

import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class TestFrame extends JFrame {

    public TestFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        init();
        pack();
        setVisible(true);
    }

    private void init() {
        final JPopupMenu menu = new JPopupMenu("test");
        menu.add(new JMenuItem("1"));
        final JList<String> list = new JList<String>(new String[]{"1","2","3"});
        list.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                int selectedIndex = list.getSelectedIndex();
                if(selectedIndex != -1){
                    Point indexToLocation = list.indexToLocation(selectedIndex);
                    Rectangle cellBounds = list.getCellBounds(selectedIndex, selectedIndex);
                    menu.show(list, indexToLocation.x, indexToLocation.y+cellBounds.height);
                }
            }
        });

        add(list);
    }

    public static void main(String... strings) {
        new TestFrame();
    }

}
韩鸿
2023-03-14

你会想要使用 JList#getCellBounds

int selectedIndex = list.getSelectedIndex();
Rectangle bounds = list.getSelectedBounds(selectedIndex, selectedIndex);

这将为您提供所选项目在JList上下文中的位置,您需要将其转换为屏幕空间…

Point p = bounds.getLocation();
SwingUtilities.convertPointToScreen(p, list);

你可能还想看看《多个JFrames的使用:好的还是坏的实践?

例如...

import java.awt.EventQueue;
import java.awt.Point;
import java.awt.Rectangle;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
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 List {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new List();
    }

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

                final JFrame selected = new JFrame("Selected");
                selected.add(new JLabel("Here I am"));
                selected.pack();

                DefaultListModel model = new DefaultListModel();
                for (int index = 0; index < 1000; index++) {
                    model.addElement("#" + index);
                }
                final JList list = new JList(model);
                list.addListSelectionListener(new ListSelectionListener() {
                    @Override
                    public void valueChanged(ListSelectionEvent e) {
                        int index = list.getSelectedIndex();
                        Rectangle bounds = list.getCellBounds(index, index);
                        Point p = bounds.getLocation();
                        p.y += bounds.height;
                        SwingUtilities.convertPointToScreen(p, list);
                        p.x -= selected.getWidth();
                        selected.setLocation(p);
                        selected.setVisible(true);
                    }
                });

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

}
 类似资料:
  • 问题内容: 我用数据库搜索的结果修改了,以便稍后使用该选择提出另一个数据库请求。 我想获取该字段的值。我可以使用哪种方法? 我只是以为我也可以向中添加事件,并将其保留在控制器的属性中。那也可以接受吗? 问题答案: 用这样的列表视图说: 从ListView获取选定的元素: 跟踪(监听)列表视图选择中的更改:

  • 我正在创建一个屏幕,上面有四个列表。基本上是两对列表,您可以在对中的一个列表上选择行,然后将它们移动到对中的另一个列表。 查看文档,我需要为每个列表提供一个ListSelectionModel来确定选择了哪些行。我将使用[Sel]或[Des]按钮来执行实际的传输。 文档和示例说我需要一个ListSelectionListener,但是,由于在用户单击按钮之前我不会访问模型,所以我实际上需要一个监听

  • 错误图像使用对象我试图在JList中的jtextfield中显示选定的元素文本。该列表包含数据库数据和图像,其中从列表中获取所选值会引发错误。 建议我如何单独从jlist获取文本并将其显示在JTextField中。

  • 问题内容: 使用Javascript,如何确定给定位置的元素?基本上,我希望编写一个函数,该函数接受两个输入参数(x和y坐标),并在参数所表示的屏幕上的位置处返回html元素。 问题答案: http://dev.w3.org/csswg/cssom-view/#dom-document- elementfrompoint http://msdn.microsoft.com/zh- CN/libra

  • 本文向大家介绍JavaScript获取指定元素位置的方法,包括了JavaScript获取指定元素位置的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript获取指定元素位置的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • 我正在尝试从JList中删除选定的元素。我知道怎么去掉一个 然而;有办法删除我选择的索引吗?我知道这个功能 返回一个Int数组。我想,如果我遍历它以移除索引,它应该会起作用,但是,我会从中得到错误(假设是因为索引#正在下降)。