2

我对 Java 很陌生,并且正在使用 Netbeans。我制作了一个 JList 用作接收器,它包含在 jScrollPane 中。当我将项目添加到 jList 时,我希望它贴在底部,以滚动列表中的最后一个项目。我尝试过使用ensureIndexIsVisible(int),但它似乎根本没有任何效果。

我已经宣布了 DLM...

public class ShoppingCart extends javax.swing.JFrame {

DefaultListModel dlm = new DefaultListModel();

我正在使用它来填充列表....

private void PrintToReceipt(){

    JList Receipt = new JList( dlm );

    dlm.addElement(ItemQuantity + "@ " + Money.format(ItemPrice) + " * " + TaxRate.format(ItemTax) + "% = " + Money.format(ItemTotal));

    Receipt.ensureIndexIsVisible(Receipt.getSelectedIndex());

}

我也尝试过 的变体getSelectedIndex,但只是简单地放置我的变量来跟踪我添加了多少项目,没有任何效果。当我添加更多然后可以在视口中看到时,它会简单地继续添加它们,但滚动条保持在顶部。谁能告诉我我还能尝试什么?

4

2 回答 2

4

检查选择的索引值是什么。还尝试将 ensureIndexIsVisible 包装在SwingUtilities.invokeLater

于 2012-09-10T06:46:25.727 回答
3

有两种方法:

通过包装ensureIndexIsVisibleinvokeLater@Stas如上所述+1)

或者

直接使用ListSelectionListener,例如

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class ListOneItem extends JFrame implements ListSelectionListener {

    private static final long serialVersionUID = 1L;

    public ListOneItem() {
        setLayout(new GridLayout(1, 2));
        String[] numbers = {"one", "two", "three", "four", "five", "six", "seven"};
        final JList list = new JList(numbers);
        list.setVisibleRowCount(1);
        list.addListSelectionListener(this);
        JScrollPane scrollPane = new JScrollPane(list);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        add(scrollPane);
        Runnable doRun = new Runnable() {

            @Override
            public void run() {
                list.setSelectedIndex(3);
            }
        };
        SwingUtilities.invokeLater(doRun);
    }

    @Override
    public void valueChanged(final ListSelectionEvent e) {
        JList list = (JList) e.getSource();
        list.ensureIndexIsVisible(list.getSelectedIndex());
    }

    public static void main(String[] args) {
        Runnable doRun = new Runnable() {

            @Override
            public void run() {
                ListOneItem frame = new ListOneItem();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.pack();
                frame.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(doRun);
    }
}
于 2012-09-10T06:57:35.947 回答