2012-04-22 102 views
1

我是一名编程青蛙游戏的学生,当青蛙与对象碰撞或到达结束区域时,分数递增或者递减,青蛙回到了开始位置。这部分工作,并将其输出到控制台时递减和递增工作,我尝试将该变量传递给另一个jpanel并将其显示在那里,但它不更新和显示textField中的变量。试图显示在一个jpanel中创建的变量,并将其显示在另一个jpanel中

游戏面板

public GamePanel() { 
    super(); 
    setFocusable(true); 
    addKeyListener(new KeyList()); 
    System.out.println("GAME PANE FOCUS:" + this.isFocusOwner()); 

    scores.setVisible(true); 
    lives = p.STARTLIVES; 
    scores.setCurrentLives(lives); 
    txtTest.setText("Hello"); 
    txtTest.setVisible(true); 
    add(scores,new AbsoluteConstraints(0,550,50,800)); 
    Boolean displayable = scores.isDisplayable(); 
    System.out.println("Displayable" + displayable); 

    scores.setEnabled(false); 
    scores.revalidate(); 
    scores.repaint(); 
    scores.setVisible(true); 

    System.out.println("Displayable" + displayable); 



    car1.start(); 
    car2.start(); 
    car3.start(); 
    car4.start(); 
    Log1.start(); 
    Log2.start(); 
    Log3.start(); 
    Log4.start(); 
    Log5.start(); 
    Log6.start(); 
    Log7.start(); 
    Log8.start(); 



    //check for collisions 
} 

final public void winZone(Rectangle object){ 

    if(myFrog.frogArea().intersects(object)){ 
     currentScore = currentScore + 100; 
     System.out.println("current Score " + currentScore); 
     p.setScore(currentScore); 
     scores.myScore().setText("hello"); 

     myFrog.lostLife(); 
    } 

分数面板

public class jplScores extends JPanel { 
Properties p = new Properties(); 
int currentLives; 
int i; 

/** Creates new form jplScores */ 
public jplScores() { 
    initComponents(); 




} 
public void setCurrentLives(int Lives){ 
currentLives = Lives; 
} 
public String getCurrentLives(){ 
    String L = Integer.toString(currentLives); 
    return L; 
} 


public JTextField myScore(){ 
    return txtScore; 
} 

目前,它会从帧显示的JPanel,他们都在,但我试图使面板内会这样其面板但我不能让面板在游戏面板中显示。

任何帮助将是巨大的感谢

public FroggerGame() { 

    initComponents(); 
    setFocusable(true); 
    //repaint(); 
    // p.setHeight(550); 
    // p.setWidth(800); 
    // p.setLives(3); 
    // p.setScore(0); 
    PANELHEIGHT = p.getHeight(); 
    PANELWIDTH = p.getWidth(); 
    welcomePanel(); 

    /* 
    Toolkit tool = Toolkit.getDefaultToolkit(); 
    imgBackground = tool.getImage(imageBackground); 
    background = new ImageIcon(imgBackground); 
    //setDefaultCloseOperation(EXIT_ON_CLOSE); 
    */ 

    jps.myScore().addPropertyChangeListener(new java.beans.PropertyChangeListener() { 
     public void propertyChange(java.beans.PropertyChangeEvent evt) { 
      // txtScorePropertyChange(evt); 

    jps.myScore().setText(Integer.toString(gp.currentScore())); 
    System.out.println(Integer.toString(gp.currentScore())); 

    jps.getScore(gp.currentScore()); 
    System.out.println(" main score " + gp.currentScore()); 
     } 
    }); 


} 

....

private void btnEnterActionPerformed(ActionEvent evt) { 

    welcomePanel.setVisible(false); 
    getContentPane().setLayout(new AbsoluteLayout()); 
    getContentPane().add(gp,new AbsoluteConstraints(0,0,800,550)); 
    getContentPane().add(jps,new AbsoluteConstraints(0,550,800,100)); 

    //gp.setSize(800, 550); 
    // gp.setBounds(0, 0, 800, 550); 
    gp.setVisible(true); 
    gp.requestFocusInWindow(); 

    jps.setVisible(true); 

金币是游戏面板和JPS是乐谱面板。

回答

1

这实际上与“面板”或Swing GUI编码没有多大关系,并且都涉及将信息从一个类传递到另一个类的基本OOPS问题。要解决这个问题的一种方法是给你的分数板的公共方法,说

public void changeScore(int value) { 
    // in here add the new value to the currently 
    // displayed value and display the new value. 
} 

然后主类,一有成绩面板的参考,你可以,如果比分是增加调用此方法,传递1如果减少则为-1。

我认为这是“推”解决方案,其中一个类将信息推送到另一个类中。解决这个问题的另一种方法是通过侦听器,其中Scores类监听其他类的关键属性,然后在发生适当事件时更改自己的分数,这通常涉及使用PropertyChangeListeners或其他更多Swing特定的侦听器类。这有时是一个更好的解决方案,但我认为它是一个稍微先进的概念。

+0

我已经尝试了上面的公共方法和这项工作,当面板第一次显示时,它显示了它第一次调用时的值,但之后无法更新。您建议使用什么样的监听器,因为该操作取决于用户现在通过按键或鼠标单击与某物碰撞。我会在早上尝试你的“推”解决方案,因为我可能错过了一些东西。非常感谢您的回复 – 2012-04-22 23:52:54

+0

@Nathan:最通用的侦听器可能是一个PropertyChangeListener。 – 2012-04-23 02:01:14

+0

我试过属性更改侦听器,但这似乎并没有工作只承认最初的变化ive添加了一些更多的代码时,我将面板添加到框架和监听器。 它的1个框架类和两个独立的面板,我想从一个面板的数据出现在另一个实时作为其游戏的一部分。 很多再次感谢 – 2012-04-23 14:11:44