Как прокрутить окно просмотра JScrollPane, содержащее JPanel, в указанное место - PullRequest
5 голосов
/ 25 октября 2011

Я пытаюсь создать большую игровую доску, чтобы только часть ее была видна в окне просмотра и хотела бы иметь возможность перемещать область просмотра с помощью клавиш со стрелками, чтобы увидеть всю доску.Прямо сейчас у меня есть 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);

    }


}

Ответы [ 3 ]

9 голосов
/ 25 октября 2011

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

В качестве альтернативы рассмотрите возможность использования привязок клавиш , показанных здесь , здесь и здесь .

4 голосов
/ 25 октября 2011

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

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

Использование setViewPosition() должно работать нормально.

2 голосов
/ 28 октября 2011

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

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

...