Как прокрутить область просмотра JScrollPane, содержащую JPanel, в определенное место

Я пытаюсь создать большую игровую доску, только часть которой будет видна в окне просмотра, и я хотел бы иметь возможность перемещать окно просмотра с помощью клавиш со стрелками, чтобы увидеть всю доску. Прямо сейчас у меня есть JScrollPane, который содержит JPanel, в котором будут изображения, текст и другие вещи, но это не имеет значения. Прямо сейчас у меня есть ImageIcon того же размера, что и JPanel в качестве фона, и я хотел бы иметь возможность перемещать область просмотра с помощью клавиш и не иметь видимых полос прокрутки. Я попытался вызвать getViewPort().setViewPosition(), а затем revalidate() в JPanel и JScrollPane. Но это все еще не работает. Мой код ниже

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import java.awt.*;
import java.awt.event.*;


public class Game extends JPanel {

    JPanel game = new JPanel();
    JScrollPane scrollPane = new JScrollPane(game);
    JLabel grass = new JLabel();

    private KeyListener keys = new KeyListener() {
        public void keyTyped(KeyEvent e) {

        }
        public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                System.out.println("Down");
                scrollPane.getViewport()

            } else if (e.getKeyCode() == KeyEvent.VK_UP) {
                System.out.println("up");
            }
            revalidate();
        }
        public void keyPressed(KeyEvent e) {

        }
    };

public void createGame(int turns) {

        int gameWidth = 1800;
        int gameHeight = 1600;

        int viewPortWidth = 800;
        int viewPortHeight = 600;

        //setLayout(null);
        setSize(new Dimension(viewPortWidth, viewPortHeight));

        game.setLayout(null);
        game.setSize(new Dimension(gameWidth, gameHeight));

        //add the background image
        ImageIcon background = new ImageIcon("Grass.png");
        grass.setIcon(background);
        grass.setBounds(0,0, gameWidth, gameHeight);
        game.setBackground(Color.GREEN);
        game.add(grass);
        game.setBounds(0,0, gameWidth, gameHeight);

        //key listener
        game.addKeyListener(keys);

        //add(game);
        scrollPane.setPreferredSize(new Dimension(viewPortWidth, viewPortHeight));

        add(scrollPane);

    }


}

person Heheas    schedule 25.10.2011    source источник


Ответы (3)


В примере используется scrollRectToVisible() здесь и здесь. Вы должны быть в состоянии адаптировать его к вашему использованию.

Кроме того, рассмотрите возможность использования привязки клавиш, как показано здесь, здесь и здесь.

person trashgod    schedule 25.10.2011

KeyEvents идут только к компонентам, которые имеют фокус. По умолчанию JPanel не имеет фокуса, поэтому не получает KeyEvents. Вы можете настроить фокус панели, вызвав setFocusable() на панели.

Swing был разработан для использования с привязками клавиш. Их можно настроить для работы, даже если компонент не имеет фокуса.

Используя setViewPosition()< /a> должно работать нормально.

person camickr    schedule 25.10.2011
comment
Спасибо за код KeyEvent, он у меня уже работает. Но когда дело доходит до позиции окна просмотра, setViewPosition() не работает. Я даже пытался вызывать revalidate и repaint на всякий случай. Кажется, это все еще не работает - person Heheas; 25.10.2011
comment
Опубликуйте свой SSCCE, демонстрирующий проблему. - person camickr; 25.10.2011

Моя проблема заключалась в том, что макет панели просматривался как нулевой, а не как BorderLayout, к сожалению, это означает, что у меня должны быть полосы прокрутки.

В настоящее время я нахожу способ скрыть полосы прокрутки и сохранить функциональность

person Heheas    schedule 28.10.2011