Текст 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 но очевидно, что это не работает.
Как мне поступить здесь?

Вот некоторые "комментарии / копии", которые я регулярно использую:

  1. Графические интерфейсы Java должны работать на разных ОС, размерах экрана, разрешении экрана и т. Д. С использованием разных PLAF в разных локалях. Как таковые, они не способствуют идеальному расположению пикселей. Вместо этого используйте менеджеры компоновки или их комбинации вместе с отступами макета и границами для пробелов.
  2. См. Следует ли мне избегать использования методов set(Preferred|Maximum|Minimum)Size в Java Swing? (Да.)
  3. Предоставьте ASCII-изображение или простой чертеж предполагаемой компоновки графического интерфейса в минимальном размере, а при изменении размера - с большей шириной и высотой.

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

  1. Это совет, который я предлагаю людям, пытающимся null макет, но это также относится и здесь.
  2. Это актуально, потому что есть один компонент (окрашенный, если он существует), который должен @Override getPreferredSize(..) метод возврата размера в качестве предложения менеджерам компоновки или для упаковки контейнера верхнего уровня.
  3. Третий комментарий заключается в том, что трудно посоветовать, как кодировать этот графический интерфейс, не зная конечного эффекта, который требуется.

Конечно, я должен отметить: каждый поток SO, как ожидается, будет одним конкретным вопросом. Я действительно должен был сказать вам, чтобы начать новый вопрос по другим вопросам, но позвольте ему скользить для этого редактирования.

Другие вопросы по тегам