2012-04-22 2 views
1

Я ученик, программирующий игру лягушки, когда лягушка сталкивается с объектом или достигает конечной зоны, либо оценка увеличивается, либо уменьшается, а лягушка вернулась в начальную позицию. этот раздел работает, а декремент и приращение работают при выводе их на консоль, я пытаюсь передать эту переменную в другую jpanel и отображать ее там, но она не обновляет и не отображает переменную в текстовом поле.Пытается отобразить переменную, созданную в одном jpanel, и отобразить ее в другом jpanel.

Game Panel

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, если он должен уменьшаться.

Я думаю об этом как о «push» решении, где один класс передает информацию в другой класс. Другой способ решить это - через слушателей, где класс Scores прослушивает критические свойства другого класса, а затем меняет собственный счет, когда происходит соответствующее событие, и это часто связано с использованием PropertyChangeListeners или других более специфичных для Swing классов слушателя. Это иногда более приятное решение, но я считаю это несколько более продвинутой концепцией.

+0

Я пробовал описанный выше общедоступный метод, и эта работа, когда панель впервые отображается, отображает значение при ее первом вызове, но после этого не обновляется. Какой слушатель вы бы посоветовали использовать, поскольку действие зависит от того, что пользователь сталкивается с чем-то сейчас нажатием клавиши или щелчком мыши. Я попробую ваше «push» решение утром, так как я, возможно, что-то пропустил. Большое спасибо за ваш ответ –

+0

@Nathan: наиболее распространенным слушателем, вероятно, будет PropertyChangeListener. –

+0

Я попробовал прослушиватель смены свойств, но это, похоже, не работает, только распознает начальное изменение. Ив добавил еще один код, когда добавляю панели в кадр и в Слушатель. его 1 класс кадра и две отдельные панели, и я хочу, чтобы данные с одной панели отображались в другой в реальном времени в качестве ее части игры. еще раз спасибо –

Смежные вопросы