Проблемы JScrollPane - PullRequest
       19

Проблемы JScrollPane

2 голосов
/ 30 ноября 2011

Если я добавлю JTable к JPanel, а затем добавлю JPanel к JScrollPane, всякий раз, когда JTable получает фокус, панель прокрутки автоматически прокручивается до самого дна, что плохо.

У меня есть много причин сделать это, поэтому я надеюсь, что какое-то решение остановит эту автопрокрутку.

О, а вот и кикер ... Кажется, что это происходит только при запуске приложения через JNLP/WebStart, и оно НЕ делает этого в Eclipse, что еще более расстраивает.

Вот краткий пример того, что если вы запускаете через JLNP, щелкните текстовое поле, щелкните таблицу, а затем она автоматически прокрутится вниз:

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

public class ScrollDemo extends JPanel{

private static final long serialVersionUID = 1L;

public ScrollDemo() 
{
    this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
    JTable table = new JTable(100,6);
    this.add(new JTextField());
    JPanel panel = new JPanel();
    panel.add(table);
    JScrollPane scroll = new JScrollPane(panel);
    this.add(scroll);
}

/**
 * Create the GUI and show it. For thread safety, this method should be
 * invoked from the event-dispatching thread.
 */
private static void createAndShowGUI() {
    // Create and set up the window.
    JFrame frame = new JFrame("ScrollDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Create and set up the content pane.
    JComponent newContentPane = new ScrollDemo();
    newContentPane.setOpaque(true); // content panes must be opaque     
    frame.setContentPane(newContentPane);
    frame.setPreferredSize(new Dimension(500, 500));

    // Display the window.
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    // Schedule a job for the event-dispatching thread:
    // creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}

Ответы [ 5 ]

2 голосов
/ 30 ноября 2011

Я не могу воспроизвести проблему, но могу предложить несколько наблюдений:

  1. Метод фрейма add() автоматически перенаправляет компонент в contentPane.

  2. Вместо установки предпочтительного размера кадра, используйте setPreferredScrollableViewportSize() для таблицы.

  3. Если нежелательная прокрутка вызвана обновлением модели таблицы, см.это пример того, как временно приостановить прокрутку.

  4. Престижность использования потока обработки событий .

  5. Приложение: вложенное panel, имеющее (по умолчанию) FlowLayout, является лишним.

enter image description here

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

/** @see https://stackoverflow.com/questions/8319388 */
public class ScrollDemo extends JPanel {

    public ScrollDemo() {
        this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
        JTable table = new JTable(100, 6);
        table.setPreferredScrollableViewportSize(new Dimension(320, 240));
        this.add(new JTextField());
        this.add(new JScrollPane(table));
    }

    private static void createAndShowGUI() {
        // Create and set up the window.
        JFrame frame = new JFrame("ScrollDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create and set up the content pane.
        frame.add(new ScrollDemo());
        frame.pack();

        // Display the window.
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
1 голос
/ 11 февраля 2012

На всякий случай, если кому-то все равно, проблема была в том, что в программе запуска eclipse и JNLP для приложения был другой KeyboardFocusManager, а в JNLP - некоторые причуды.

Я не знал, что пользовательский KeyboardFocusManagerдобавлено на стороне JLNP, но, по крайней мере, это объясняет.

Спасибо всем.

0 голосов
/ 02 декабря 2011

Что ж, мне пришлось переделать то, как я добавлял свои объекты на панель прокрутки, чтобы избежать этой проблемы.В частности, если таблица будет выше, чем высота области просмотра, тогда мне просто нужно добавить таблицу непосредственно в область прокрутки, а затем изменить способ использования промежуточной панели.

0 голосов
/ 01 декабря 2011

У меня возникла проблема с автоматической прокруткой JTables, когда я помещал их в промежуточный JPanel вместо того, чтобы помещать их непосредственно в область просмотра JScrollPane. В этих случаях удаление посторонней панели и размещение таблицы непосредственно на панели прокрутки решило мои проблемы.

0 голосов
/ 30 ноября 2011

Согласно это , чтобы изменить выбор для вашего JTable, вам необходимо изменить модель выбора.Попробуйте использовать следующее для установки выбранного элемента на самый первый.

ListSelectionModel selectionModel = table.getSelectionModel();
selectionModel.setSelectionInterval(start, end);

Посмотрите, дает ли это фокус верхней части JTable?

РЕДАКТИРОВАТЬ: яделали это раньше, так что не знаете, каким будет начало и конец, попробуйте 0,0 или 0,1, может быть?

...