有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在JscrollPane上向特定位置动态添加滚动项

问题的简短版本是:我有一个JScrollPane,其中有大量项目被滚动。在某些时候,我想在JScrollPane中添加一些项目,让它们不出现在列表的末尾,而是出现在(例如)第17个项目之后

通常情况下,如果所讨论的代码在JScrollPane派生类中,我就这么说。添加();但我相信这已经到了列表的末尾

理由:案例1:我滚动的基础数据是一个有序的项目列表,但在列表的任何位置都允许添加。当我在列表中间添加内容时,我希望避免将整个列表再次加载到JScrollPane中

案例2:我正在模拟一个滚动列表,其中包含扩展的子类别。因此,如果用户选择了一个具有扩展子类别的项目,我的操作代码会识别这种情况,查看程序数据以找到子类别,然后将它们添加到所选类别下的JScrollPane中。不用担心,但也会有一些视觉指示,表明它是一个子类别,由我的操作代码提供

我能把这些都编出来。我希望学习的是如何在不将其添加到列表末尾的情况下向JScrollPane添加内容


共 (1) 个答案

  1. # 1 楼答案

    答案取决于您要将项目添加到的组件。如果您使用的是JList,那么可以使用类似^{}的东西将项目添加到特定位置

    如果您使用的是基于JComponent(比如JPanel)的东西,那么可以使用^{}来指定应该添加组件的位置,这假设该位置存在(即如果容器仅包含单个组件,则无法将组件添加到位置100)

    以下示例生成一个随机数,确定为维护有序列表而应插入该数字的位置,并在该点插入一个组件。它还将尝试滚动JScrollPane以使项目可见

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JViewport;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class Test10 {
    
        public static void main(String[] args) {
            new Test10();
        }
    
        public Test10() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestPane extends JPanel {
    
            private JPanel numbers;
            private List<Integer> values;
    
            public TestPane() {
                values = new ArrayList<>(25);
                setLayout(new BorderLayout());
                numbers = new JPanel(new GridLayout(0, 1));
                add(new JScrollPane(numbers));
    
                Timer timer = new Timer(500, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        int next = (int) (Math.random() * Integer.MAX_VALUE);
                        int insertion = Collections.binarySearch(values, next);
                        if (insertion < 0) {
                            insertion = (Math.abs(insertion)) - 1;
                        }
                        values.add(insertion, next);
                        JLabel label = new JLabel(Integer.toString(next));
                        numbers.add(label, insertion);
                        numbers.revalidate();
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                Point p = label.getLocation();
                                JViewport vp = (JViewport) numbers.getParent();
                                JScrollPane sp = (JScrollPane) vp.getParent();
                                vp.setViewPosition(p);
                            }
                        });
                    }
                });
                timer.start();
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
    
        }
    
    }