Как изменить текст jlabel из другого класса

#java #swing #jlabel

#java #swing #jlabel

Вопрос:

Привет, я создаю приложение, но обнаружил проблему. Я использую netbeans gui builder для создания своего графического интерфейса.

Итак, в первом классе gui есть много кнопок (каждая кнопка выполняет одну и ту же функцию), у которых есть actionlistener, который выглядит следующим образом:

 public class Guipanel extends JPanel {
private void jbtTTActionPerformed(java.awt.event.ActionEvent evt) {                                      
    if(mb.getlevel() > 16){
    if(ttp != 20 amp;amp; mb.getpoints() != 0){
        point();
        ttp  ;
        jbtTT.setText("" ttp);
        }
    }
}
private void point(){
    mb.reducepoints();
}
int ttp;
Base mb = new Base();
JButton jbtTT = new JButton();
}
  

Базовый класс имеет много методов, но тот, который связан с этой проблемой, выглядит следующим образом:

 public class Base extends JFrame {

//point decrement method
public void reducepoints(){
    points--;
    jlbPoints.setText("Points Available: " points);
}

//return point value
public int getpoints(){
    return this.points;
}

//return level value
public int getlevel(){
    return this.level;
}
private static int level = 1;
private static int points = 20;
private JLabel jlbPoints = new JLabel("Points Available: " points);
}
  

Итак, проблема в том, что когда я нажал jbtTT, points переменная уменьшится, поэтому значение изменится с 20 на 19. Раньше я System.out.println это проверял. Как вы можете видеть, reducepoints() метод должен обновлять jlbPoints текст, которого он не делает. Я попытался создать Base mb = new Base() to static Base mb = new Base() , но он все еще не работает. Я делаю это неправильно? У кого-нибудь есть предложения?

РЕДАКТИРОВАТЬ: я пытался это сделать System.out.println(jlbPoints.getText()); , и текст изменился. Единственный, который не изменился, — это текст, который может видеть пользователь. Даже repaint() и revalidate не сработало.

EDIT2: Я наконец нашел ответ на этот вопрос. Я должен передать объект класса ‘Base’ классу ‘Guipanel’, поскольку я создал объект класса ‘Base’ в основном классе (я не хочу использовать этот класс в качестве основного класса). Я передал его с помощью следующего метода:

 public void passObj(Base mb){
    this.mb = mb;
}
  

и изменение конструктора класса ‘Guipanel’ следующим образом:

 public Guipanel(Base mb) {
    initComponents();
    this.mb = mb;
}
  

также меняем это Base mb = new Base(); на Base mb;

Я хотел бы поблагодарить всех, кто пытался ответить на этот вопрос.

Комментарии:

1. «Привет, я создаю приложение, но я обнаружил проблему. Я использую netbeans gui builder для создания своего графического интерфейса. » Да, создание вашего графического интерфейса с помощью Netbeans GUI builder будет проблемой, если вы не понимаете, как создать графический интерфейс или ООП 101. Я предлагаю вам на данный момент отложить графические интерфейсы и посетить Классы и объекты: определение методов . Определите для него метод в первом классе и вызовите этот метод из второго.

2. Очень верно @AndrewThompson, Netbeans IDE предназначена для профессионалов, а не для начинающих!!!

3. Я понимаю, как создать простой графический интерфейс. @AndrewThompson

Ответ №1:

Попробуйте использовать SwingUtilities.invokeLater() , чтобы убедиться, что вы меняете текст в потоке отправки событий, как и предполагалось. Все, что мы можем сделать, это угадать, учитывая текущую информацию.

Комментарии:

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