2015-11-07 105 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