我正在尝试创建一个大型游戏板,只有部分游戏板在视口中可见,并且希望能够使用箭头键移动视口以查看整个板。现在我有一个JScrollPane包含一个JPanel,它将包含图像和文本以及其他东西,但这些都是无关紧要的。现在我有一个与JPanel相同大小的ImageIcon作为背景,我希望有一个选项,可以通过使用键移动视口,而不是有任何可见的滚动条。 我试过在JPanel和JScrollPane上调用getViewPort()。setViewPosition(),然后调用revalidate()。但它仍然无效。我的代码在
之下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);
}
}
答案 0 :(得分:9)
有一个使用scrollRectToVisible()
here和here的示例。您应该能够根据您的使用情况进行调整。
另外,请考虑使用key bindings,here,here和here。
答案 1 :(得分:4)
KeyEvents仅转到具有焦点的组件。默认情况下,JPanel
没有焦点,因此它不会收到KeyEvent
个。您可以通过调用面板上的setFocusable()
方法使面板具有焦点。
Swing旨在与Key Bindings一起使用。即使组件没有焦点,它们也可以设置为工作。
使用setViewPosition()
应该可以正常工作。
答案 2 :(得分:2)
我的问题是我将Panel的布局视为null而不是BorderLayout,不幸的是,这意味着我必须有滚动条。
我目前正在寻找隐藏滚动条并保留功能的方法