#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 и десятках примеров, которые вы можете легко получить таким образом. Я не видел и до сих пор не вижу никакого смысла повторять это.