2011-10-25 26 views
4

我試圖創建一個大型遊戲板,只有它的一部分會在視口中可見,並且希望能夠使用箭頭移動視口鍵看到整個板。現在我有一個JScrollPane,它包含一個JPanel,它將具有圖像和文本以及其他內容,但這些都不相關。現在我有一個與JPanel相同大小的ImageIcon作爲背景,我希望有一個選項可以使用鍵移動視口,而不是任何可見的滾動條。 我已經嘗試在JPanel和JScrollPane上調用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

KeyEvents僅轉到具有焦點的組件。默認情況下,JPanel沒有焦點,因此它不會收到KeyEvent。通過在面板上調用setFocusable()方法,可以使面板成爲可聚焦的。

Swing設計用於Key Bindings。即使組件沒有焦點,它們也可以設置爲工作。

使用setViewPosition()應該可以正常工作。

+0

感謝您的KeyEvent代碼,我已經有這個工作。但是,當涉及到視口位置時,setViewPosition()似乎不起作用。我甚至嘗試調用revalidate並重新繪製以防萬一。它仍然不起作用 – Heheas

+0

發佈您的SSCCE,證明問題。 – camickr

2

我的問題是我的面板佈局被視爲null而不是BorderLayout,不幸的是這意味着我必須有滾動條。

我目前在尋找一種方法來隱藏滾動條並保持功能

相關問題