Установка текста JLabel во время выполнения - PullRequest
1 голос
/ 06 октября 2011

Я довольно новичок в Java (около 2 недель), и я пытаюсь установить текст JLabel.Единственная проблема в том, что я делаю вычисления в другом классе и не знаю, как ссылаться на Jlabel, который я уже создал.Вот два рассматриваемых класса.

package fightsim;

import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class FightSimPane extends JPanel {
FightManager FightManager = new FightManager();
/**
 * Create the panel.
 */
public FightSimPane() {
    setLayout(new MigLayout("", "[][][][][][][][][][]", "[][][][]"));

    JLabel lblChampionleft = new JLabel("ChampionLeft");
    add(lblChampionleft, "cell 1 3");

    JButton btnGo = new JButton("Go");
    btnGo.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            FightManager.startFight();
            FightManager.runTheFight();

        }
    });
    add(btnGo, "cell 5 3");

    JLabel lblChampionright = new JLabel("ChampionRight");
    add(lblChampionright, "cell 9 3");

}


public void setLeftChampionLabel(String s){
    //not able to reference Jlabel lblChampionLeft here???
    System.out.println("Setting Left Champion text to"+s);

}

public void setRightChampionLabel(String s){
    //not able to reference Jlabel lblChampionRight here???
    System.out.println("Setting Right Champion text to"+s);
}


}

И класс, который пытается установить метку.

package fightsim;

public class FightManager {

Champion LeftChamp = new Champion();
Champion RightChamp = new Champion();

public FightManager() {

}

Thread LeftChampThread = new Thread(LeftChamp);
Thread RightChampThread = new Thread(RightChamp);

;

public void startFight() {

    LeftChamp.setHealth(200);
    RightChamp.setHealth(300);
    LeftChamp.setATKsp(1000);
    RightChamp.setATKsp(1000);
    LeftChamp.setAD(20);
    RightChamp.setAD(20);

}

public void runTheFight() {
    System.out.println("Starting Threads");
    LeftChampThread.start();
    RightChampThread.start();

    while ((LeftChamp.getHealth() > 0) && (RightChamp.getHealth() > 0)) {

        if (RightChamp.isReadyToAttack()) {
            LeftChamp.setHealth(LeftChamp.getHealth() -     RightChamp.getAD());
            RightChamp.setNotReady();
            System.out.println("Setting Left Champion test to"
                    + Integer.toString(LeftChamp.getHealth()));

            // This is where I'd like to update the left Jlabel in
            // FightSimPane

        }
        if (LeftChamp.isReadyToAttack()) {
            RightChamp
                    .setHealth(RightChamp.getHealth() - LeftChamp.getAD());
            LeftChamp.setNotReady();
            System.out.println("Setting Right Champion test to"
                    + Integer.toString(RightChamp.getHealth()));

            // This is where I'd like to update the right Jlabel in
            // FightSimPane
        }

    }

}
}

Итак, вопрос ... Как я могу позволить своему FightManagerДоступ к классу и изменение JLabel в моем классе FightSimPane / Gui.Заранее спасибо, и извините, если это глупый вопрос.Я ужасно новичок в программировании, и я все еще пытаюсь принять все это. С учетом сказанного, любой другой совет будет отличным.Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Передавайте ссылки, чтобы классы могли общаться друг с другом, и не только с этим, но и с правильным активным экземпляром класса другого типа.Например, вы могли бы предоставить FlightManager поле FlightSimPane:

class FightManager {

   private FightSimPane fightSimPane;

   // and fill it in the constructor:
   public FightManager(FightSimPane fightSimPane) {
      this.fightSimPane = fightSimPane;
   }

Тогда вы будете иметь дело с фактическим визуализированным объектом графического интерфейса FightSimPane.

Обратите внимание, что вам придется позаботиться опередайте правильный экземпляр:

public class FightSimPane extends JPanel {
   FightManager FightManager = new FightManager(this);

Затем вы можете вызвать открытые методы FightSimPane в классе FightManager:

public void runTheFight() {
  System.out.println("Starting Threads");
  LeftChampThread.start();
  RightChampThread.start();

  while ((LeftChamp.getHealth() > 0) && (RightChamp.getHealth() > 0)) {

     if (RightChamp.isReadyToAttack()) {
        LeftChamp.setHealth(LeftChamp.getHealth() - RightChamp.getAD());
        RightChamp.setNotReady();
        System.out.println("Setting Left Champion test to"
              + Integer.toString(LeftChamp.getHealth()));

        // !!!  **** added this *************
        fightSimPane.setRightChampionLabel("Setting Left Champion test to"
              + Integer.toString(LeftChamp.getHealth()));

     }

РЕДАКТИРОВАТЬ 1
Я вижу здесь еще одну потенциально серьезную и не связанную проблему:

  while ((LeftChamp.getHealth() > 0) && (RightChamp.getHealth() > 0)) {

     //.........

  }

Этот код, кажется, вызывается в главном потоке Swing, EDT и его природа (хотя (true)) предполагает, что онимеет очень хорошие шансы заблокировать EDT, в результате чего обработка и обновление графики вашего Swing GUI и все пользовательские взаимодействия останавливаются.Вам может понадобиться использовать Swing Timer для этого или фоновый поток, чтобы освободить EDT для выполнения необходимой работы.

1 голос
/ 06 октября 2011

Объявите ссылочную переменную класса FightSimPane в классе FightManager и передайте ссылку на объект FightSimPane через конструктор FightManager.

В классе FightManager,

public class FightManager {

Champion LeftChamp = new Champion();
Champion RightChamp = new Champion();
private FightSimPane pane;

public FightManager(FightSimPane pane) { this.pane=pane;}
public FightManager() {
}
....

Используя ссылочную переменную "панель", вы можете получить доступ к доступным элементам FightSimPane класса.

Изменить код FightSimPane,

public class FightSimPane extends JPanel {
FightManager fightManager;

public FightSimPane() {
     fightManager= new FightManager(this);
     ...
}
...