2015-11-07 35 views
1

如何通過動態單擊鍵來更改JFrame的內容,在此示例中,我想通過兩個已創建的JPanel來更改內容,當我單擊時想更改到Panel2,當我點擊我想更改爲Panel3,但我只想改變JFrames的內容(我想留在相同的JFrame中)代碼沒有錯誤,我只是有點困惑如何解決這個問題。通過單擊鍵更改JFrame的內容

class Drawing extends JFrame implements KeyListener{ 

int num = 1; 
public Drawing() { 
      Panel2 jPanel2 = new Panel2(); 
      Panel3 jPanel3 = new Panel3(); 
      if(num == 1){ 
       add(jPanel2); 
       remove(jPanel3); 
       pack(); 
      } 
      if(num == 2){ 
       add(jPanel3); 
       remove(jPanel2); 
       pack(); 
      } 

      // be nice to testers.. 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setVisible(true); 
      addKeyListener(this); 
} 

,然後我有方法的keyPressed更改NUM取決於按下哪個鍵(我還實施的keyReleased和但的keyTyped我不包括他們添加空格)

 public void keyPressed(KeyEvent e){ 
      if(e.getKeyCode() == e.VK_UP){ 
       num = 1; 
      } 
      if(e.getKeyCode() == e.VK_DOWN){ 
       num = 2; 
      } 
    } 
    public static void main(String args[]) { 

      new Drawing(); 

    } 
1或2

,這裏是兩個面板是改變頁面的圖形

class Panel2 extends JPanel { 

    Panel2() { 
     setPreferredSize(new Dimension(500,500)); 
    } 

    public void paint(Graphics g) { 
     g.drawString("BLAH", 20, 20); 
     g.drawRect(200, 200, 200, 200); 
     repaint(); 
    } 
} 
class Panel3 extends JPanel { 

     Panel3() { 
      // set a preferred size for the custom panel. 
      setPreferredSize(new Dimension(500,500)); 
     } 

     public void paint(Graphics g) { 
      g.drawString("BURP", 20, 20); 
      g.drawRect(200, 200, 200, 200); 
      repaint(); 
     } 
} 

回答

0

首先,在您的使用情況下,不要使用活動的keyTyped因爲只是觸發

當由該鍵所表示的Unicode字符由 鍵盤發送給系統輸入

。您的用戶界面中沒有系統輸入。結帳此瞭解更多詳情:KeyListener, keyPressed versus keyTyped

相反,使用在keyPressed調用keyReleased事件。

其次,您在處理事件時需要明確調用add(jPanel2);remove(jPanel3);。設置num = 1不會做任何事情。

第三,您需要在add(jPanel2);remove(jPanel3);之後撥打jPanel2.repaint();以確保面板繪製您想要的內容。

第四,始終調用super.paint(g);正確初始化繪畫畫布!

所以,把它們放在一起,你有:

public class Drawing extends JFrame implements KeyListener { 

int num = 1; 
Panel2 jPanel2 = new Panel2(); 
Panel3 jPanel3 = new Panel3(); 

public Drawing() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    addKeyListener(this); 
    setSize(300, 300); 
} 

@Override 
public void keyTyped(KeyEvent e) { 
} 

private void changePanel() { 
    if (num == 1) { 
     remove(jPanel3); 
     add(jPanel2); 
     jPanel2.repaint(); 
     pack(); 
    } 
    if (num == 2) { 
     remove(jPanel2); 
     add(jPanel3); 
     jPanel3.repaint(); 
     pack(); 
    } 
} 

@Override 
public void keyPressed(KeyEvent e) { 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    if (e.getKeyCode() == e.VK_UP) { 
     num = 1; 
    } 
    if (e.getKeyCode() == e.VK_DOWN) { 
     num = 2; 
    } 
    changePanel(); // do the actual swap of the panels 
} 

public static void main(String args[]) { 
    new Drawing(); 
} 
} 

class Panel2 extends JPanel { 

Panel2() { 
    setPreferredSize(new Dimension(500, 500)); 
} 

public void paint(Graphics g) { 
    super.paint(g); //always call! 
    g.drawString("BLAH", 20, 20); 
    g.drawRect(200, 200, 200, 200); 
} 
} 

class Panel3 extends JPanel { 

Panel3() { 
    setPreferredSize(new Dimension(500, 500)); 
} 

public void paint(Graphics g) { 
    super.paint(g); //always call! 
    g.drawString("BURP", 20, 20); 
    g.drawOval(200, 200, 200, 200); 
} 
} 
+0

這一工程!非常感謝,我對Java有點新,我真的很感謝幫助!我只有一個問題,如果我們已經通過調用paint(Graphics g)來初始化它,爲什麼還需要調用super.paint(g)? – connor

+0

@康納爾很高興幫助 – Bon