【问题标题】:ensureIndexIsVisible(int) is not workingensureIndexIsVisible(int) 不起作用
【发布时间】:2012-09-03 00:14:42
【问题描述】:

我对 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 的变体,但只是将我的变量用于跟踪我添加了多少项目,没有任何效果。当我添加更多然后可以在视口中看到时,它会简单地继续添加它们,但滚动条保持在顶部。 谁能告诉我我还能尝试什么?

【问题讨论】:

  • 如需更好的帮助,请尽快发帖SSCCE
  • 请学习java命名约定并遵守它们。

标签: java swing jscrollpane jlist listselectionlistener


【解决方案1】:

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

【讨论】:

  • 和 ListSelectionListener
【解决方案2】:

有两种方式:

通过将ensureIndexIsVisible 包装到invokeLater (正如@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);
    }
}

【讨论】:

  • hmm ...该示例没有什么问题(除了不防范 isValueAdjusting),但与添加/确保 add 行可见无关...
  • @kleopatra 正确评论,请在线程中解决这个问题真的没有任何意义,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多