Автоматическая циклическая прокрутка активного содержимого в JPanel - выделенный текст - PullRequest
2 голосов
/ 25 июля 2011

Мне нужна автоматическая циклическая прокрутка (выделенный текст), это содержимое JPanel. Его содержимое должно реагировать на щелчки мышью по разным элементам. Так что просто рисование содержимого с перемещенными координатами здесь не работает, потому что реальное положение элементов не меняется. Также это должно быть в состоянии обновления. Скорее всего, это будет плавное обновление - без каких-либо подпрыгиваний. Попытка использовать JScrollPane без видимых скроллеров и автоматической прокрутки, она может удерживать слушателей действий, но я не могу сделать это плавным циклом и плавным обновлением содержимого.

UPDATE это должно выглядеть так:

http://h1.flashvortex.com/display.php?id=2_1311593920_25605_144_0_700_30_6_1_92

, но с изменением содержимого из кода, без остановки анимации и отказов.

Ответы [ 2 ]

5 голосов
/ 25 июля 2011

Возможно, вы сможете использовать Marquee Panel . В коде используются реальные компоненты, поэтому вы должны иметь возможность добавлять и реагировать на любого слушателя, которого вы добавляете к компонентам.

Edit:

Ой, я не знаю, о чем я думал, мой код использует метод Graphics.translate (...) для рисования компонентов, поэтому использование MouseListener напрямую не будет работать.

Edit2:

Может быть, следующий код поможет. Просто добавьте метод в класс MarqueePanel:

public Component getComponentAtPoint(Point p)
{
    int translatedX = p.x + scrollOffset;

    if (isWrap())
    {
        int preferredWidth = super.getPreferredSize().width;
        preferredWidth += getWrapAmount();
        translatedX = translatedX % preferredWidth;
    }

    Point translated = new Point(translatedX, p.y);

    for (Component c: getComponents())
    {
        if (c.getBounds().contains(translated))
            return c;
    }

    return null;
}

Теперь вы можете добавить MouseListener в MarqueePanel и затем вызвать этот метод, чтобы определить, для какого компонента был создан MouseEvent. Как только вы узнаете, по какому компоненту щелкнули, вам нужно будет вручную вызвать действие для этого компонента. Или вы можете попробовать повторно отправить MouseEvent к компоненту. Вам нужно будет воссоздать MouseEvent, чтобы сделать компонент источником события вместо панели, являющейся источником. Вам также нужно будет скрыть расположение событий X / Y относительно компонента, а не панели. Класс SwingUtils должен помочь с этим.

1 голос
/ 26 июля 2011

MarqueePanel включает в себя start() и stop() методы;это может послужить полезной отправной точкой, но вам придется выделить метод update().

Приложение: Поскольку в примере используется JLabel, его нельзя редактировать на месте .Если используется JTextField, возможно, проще всего обновить соответствующую модель, Document.

...