Събитие за превъртане на JScrollPane

Странно е, че JScrollPane няма метод addAdjustmentListener(). И все пак се казва, че adjustmentListener се използва с ленти за превъртане. Искам нещо да се случва винаги, когато JScrollPane се превърта по който и да е начин. Как да постигнем такова нещо?


person aps    schedule 03.07.2011    source източник


Отговори (4)


Защо не вземете действителните ленти за превъртане и след това не добавите слушатели за корекция към тях? JScrollBar има метод, наречен addAdjustmentListener().

И можете да използвате getVerticalScrollBar() и getHorizontalScrollBar(), за да получите JScrollBar от JScrollPane

person Michael Studebaker    schedule 03.07.2011

Вместо да се опитвате да слушате за промени от JScrollPane, вземете прозореца за изглед за този панел за превъртане, добавете слушател на промени към него:

http://download.oracle.com/javase/6/docs/api/javax/swing/JViewport.html#addChangeListener(javax.swing.event.ChangeListener)

person Jesse Barnum    schedule 03.07.2011
comment
Открих, че това е най-добрият начин. Дори поставих моя поддържащ код по-долу. Благодаря, Юджийн. - person ekerner; 10.03.2013

Според Джеси Барнъм:

// requiring that you already have JPanel additionsPane inside 
//  JScrollPane additionsScrollPane inside JFrame frame ...

additionsScrollPane.getViewport().addChangeListener(new ListenAdditionsScrolled());

public class ListenAdditionsScrolled implements ChangeListener{
    public void stateChanged(ChangeEvent e){
        additionsPane.revalidate();
        frame.repaint();
    }
}
person ekerner    schedule 10.03.2013

например (old.good.forums.sun.com)

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;

public class TilePainter extends JPanel implements Scrollable {

    private static final long serialVersionUID = 1L;
    private final int TILE_SIZE = 50;
    private final int TILE_COUNT = 100;
    private final int visibleTiles = 10;
    private final boolean[][] loaded;
    private final boolean[][] loading;
    private final Random random;

    public TilePainter() {
        setPreferredSize(new Dimension(TILE_SIZE * TILE_COUNT, TILE_SIZE * TILE_COUNT));
        loaded = new boolean[TILE_COUNT][TILE_COUNT];
        loading = new boolean[TILE_COUNT][TILE_COUNT];
        random = new Random();
    }

    public boolean getTile(final int x, final int y) {
        boolean canPaint = loaded[x][y];
        if (!canPaint && !loading[x][y]) {
            loading[x][y] = true;
            Timer timer = new Timer(random.nextInt(500),
                    new ActionListener() {

                        @Override
                        public void actionPerformed(ActionEvent e) {
                            loaded[x][y] = true;
                            repaint(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
                        }
                    });
            timer.setRepeats(false);
            timer.start();
        }
        return canPaint;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Rectangle clip = g.getClipBounds();
        int startX = clip.x - (clip.x % TILE_SIZE);
        int startY = clip.y - (clip.y % TILE_SIZE);
        for (int x = startX; x < clip.x + clip.width; x += TILE_SIZE) {
            for (int y = startY; y < clip.y + clip.height; y += TILE_SIZE) {
                if (getTile(x / TILE_SIZE, y / TILE_SIZE)) {
                    g.setColor(Color.GREEN);
                } else {
                    g.setColor(Color.RED);
                }
                g.fillRect(x, y, TILE_SIZE - 1, TILE_SIZE - 1);
            }
        }
    }

    @Override
    public Dimension getPreferredScrollableViewportSize() {
        return new Dimension(visibleTiles * TILE_SIZE, visibleTiles * TILE_SIZE);
    }

    @Override
    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
        return TILE_SIZE * Math.max(1, visibleTiles - 1);
    }

    @Override
    public boolean getScrollableTracksViewportHeight() {
        return false;
    }

    @Override
    public boolean getScrollableTracksViewportWidth() {
        return false;
    }

    @Override
    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
        return TILE_SIZE;
    }

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

            @Override
            public void run() {
                JFrame frame = new JFrame("Tiles");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(new JScrollPane(new TilePainter()));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}
person mKorbel    schedule 03.07.2011