Текст JLabel не отображается
Я новичок в Java. Я пытаюсь сделать так, чтобы текст отображался на JLabel
после нажатия виртуальной кнопки. Тем не менее, я не могу найти решение этой проблемы. Когда я использую оператор if, это не сработает. Как сделать так, чтобы текст появлялся после нажатия кнопки?
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.Graphics;
public class autos extends JLabel implements ActionListener
{
private static final long serialVersionUID = 1L;
int now=0;
public autos(){
JLabel l=new JLabel("");
JFrame f=new JFrame("the title");
JPanel p=new JPanel();
JButton b=new JButton("click");
f.setBounds(400,500,400,500);
f.setVisible(true);
p.add(b);
f.add(p);
b.addActionListener(this);
p.setVisible(true);
p.add(l);
f.add(l);
if(now==1)
{
l.setText("hello");
l.setOpaque(true);
}
p.setBounds(200,200,200,200);
l.setBounds(100,100,100,100);
l.setOpaque(true);
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawRect(200,300,89,90);
g.drawString("buv",80,80);
repaint();
}
public static void main(String[] args)
{
new autos();
}
@Override
public void actionPerformed(ActionEvent e) {
now=1;
System.out.println("worked");
System.out.println(now);
}
}
2 ответа
Вы устанавливаете свою метку в коде конструктора, который выполняется перед обработчиком события, который устанавливает now
переменная к 1.
Что вы можете сделать, это переместить этот код:
l.setText("hello");
l.setOpaque(true);
Сюда:
@Override
public void actionPerformed(ActionEvent e) {
now=1;
System.out.println("worked");
System.out.println(now);
l.setText("hello");
l.setOpaque(true);
}
Это минимально работающий пример обновления текста по нажатию кнопки. Смотрите комментарии в коде для разнообразия изменений.
import java.awt.event.*;
import javax.swing.*;
/* There is no need to extend label here. */
// public class autos extends JLabel implements ActionListener
public class autos implements ActionListener {
private static final long serialVersionUID = 1L;
int now = 0;
// this is now a class attribute, accessible to any method of this class.
JLabel l;
public autos() {
// this no longer declares a local variable, but instead
// creates an instance of the class attribute.
l = new JLabel("");
JFrame f = new JFrame("the title");
JPanel p = new JPanel();
JButton b = new JButton("click");
f.setBounds(400, 500, 400, 500); // this needs fixing!
f.setVisible(true);
p.add(b);
f.add(p);
b.addActionListener(this);
p.setVisible(true);
p.add(l);
f.add(l);
p.setBounds(200, 200, 200, 200); // this needs fixing!
l.setBounds(100, 100, 100, 100); // this needs fixing!
l.setOpaque(true);
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
}
/* I cannot tell what this was trying to achieve, but whatever it was,
this was the wrong way to go about it. Never call repaint() from within
the paintComponent method as this creates an infinite loop! */
/*
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(200, 300, 89, 90);
g.drawString("buv", 80, 80);
repaint();
}
*/
public static void main(String[] args) {
// Swing GUIs should be created and updated on the EDT
new autos();
}
@Override
public void actionPerformed(ActionEvent e) {
/* This logic is questionable, but it denpends on what you are trying
to achieve here, something I'm not clear on. */
now = 1;
if (now == 1) {
l.setText("hello");
l.setOpaque(true);
}
System.out.println("worked");
System.out.println(now);
}
}
редактировать
Вы добавили два комментария на
setBounds
часть говоряthis needs fixing!
, Там я попытался изменить размерJPanel
а такжеJLabel
но очевидно, что это не работает.
Как мне поступить здесь?
Вот некоторые "комментарии / копии", которые я регулярно использую:
- Графические интерфейсы Java должны работать на разных ОС, размерах экрана, разрешении экрана и т. Д. С использованием разных PLAF в разных локалях. Как таковые, они не способствуют идеальному расположению пикселей. Вместо этого используйте менеджеры компоновки или их комбинации вместе с отступами макета и границами для пробелов.
- См. Следует ли мне избегать использования методов set(Preferred|Maximum|Minimum)Size в Java Swing? (Да.)
- Предоставьте ASCII-изображение или простой чертеж предполагаемой компоновки графического интерфейса в минимальном размере, а при изменении размера - с большей шириной и высотой.
Теперь, чтобы расширить эти комментарии для этого варианта использования:
- Это совет, который я предлагаю людям, пытающимся
null
макет, но это также относится и здесь. - Это актуально, потому что есть один компонент (окрашенный, если он существует), который должен
@Override
getPreferredSize(..)
метод возврата размера в качестве предложения менеджерам компоновки или для упаковки контейнера верхнего уровня. - Третий комментарий заключается в том, что трудно посоветовать, как кодировать этот графический интерфейс, не зная конечного эффекта, который требуется.
Конечно, я должен отметить: каждый поток SO, как ожидается, будет одним конкретным вопросом. Я действительно должен был сказать вам, чтобы начать новый вопрос по другим вопросам, но позвольте ему скользить для этого редактирования.