2012-04-22 54 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