Установите JLabel Visible при нажатии JButton в actionPerformed - PullRequest
4 голосов
/ 21 февраля 2012

Я пытаюсь заставить JLabel появляться при нажатии JButton.Я добавил слушатель действия и добавил компонент в макет.Я использую label1.setVisible (true), когда JButton нажимается в actionPerformed.Я до сих пор не могу заставить его работать.Кто-нибудь может взглянуть на мой код?

public class LearnAppMain extends JFrame implements ActionListener {

// Define variables
public JButton button1;
public JLabel label1;
    public JTextField field1;

    private Image image1;
private String apple = "apple.jpg";

public LearnAppMain() {

    ImageIcon image1 = new ImageIcon(this.getClass().getResource(apple));
    JLabel label1 = new JLabel(image1);

    button1 = new JButton("A");
    button1.addActionListener(this);

    field1 = new JTextField(10);

    // Create layout
    setLayout(new FlowLayout());

    // create Container
    final Container cn = getContentPane();

    cn.add(button1);
    cn.add(field1);
    cn.add(label1);

    // setLayout(new FlowLayout());
    setSize(250, 250);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {

    Object source = e.getSource();

    if (e.getSource() == button1) {
        label1.setVisible(true);
        field1.setText("Apple");
    }

}

 }

У меня есть основной метод в другом файле класса.Ошибка, которую я получаю, приводит меня к label1.setVisible (true);

Каждый вопрос, который я видел, говорят, чтобы сделать это, но мне интересно, есть ли что-то еще, что нужно добавить.1006 *

Ответы [ 3 ]

5 голосов
/ 21 февраля 2012

Здесь было несколько проблем:

  • Ваш label1 был скрыт путем выполнения JLabel label в конструкторе. Вы в основном объявили другую переменную с именем label1 в своем конструкторе, которая скрыла переменную в самом классе.
  • Ваш ярлык был виден при запуске - я использовал label.setVisible(false) для теста, но вы можете захотеть иначе

Я также отложил создание Image, поскольку у меня не было изображения, поэтому раскомментируйте его и измените соответствующим образом.

Вот полная рабочая версия:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class LearnAppMain extends JFrame implements ActionListener {

// Define variables
public JButton button1;
public JLabel label1;
    public JTextField field1;

    private Image image1;
private String apple = "apple.jpg";

public LearnAppMain() {

    //ImageIcon image1 = new ImageIcon(this.getClass().getResource(apple));
    //JLabel label1 = new JLabel(image1);
    label1 = new JLabel("hello");
    label1.setVisible(false);

    button1 = new JButton("A");
    button1.addActionListener(this);

    field1 = new JTextField(10);

    // Create layout
    setLayout(new FlowLayout());

    // create Container
    final Container cn = getContentPane();

    cn.add(button1);
    cn.add(field1);
    cn.add(label1);

    // setLayout(new FlowLayout());
    setSize(250, 250);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {

    Object source = e.getSource();

    if (e.getSource() == button1) {
        label1.setVisible(true);
        field1.setText("Apple");
    }

}
public static void main(String[] args) {
  new LearnAppMain();
}
}

Я бы предложил использовать отдельные (обычно внутренние классы) ActionListener экземпляры вместо переопределения actionPerformed. Смотрите, например это для аналогичного примера, если вы заинтересованы:

Кроме того, если вы используете это в более крупном приложении (т.е. не только для экспериментов или для создания прототипов), убедитесь, что весь код Swing выполняется на EDT.

Для этой цели вы обычно используете SwingUtilities.invokeLater .

Надеюсь, это поможет.

0 голосов
/ 28 апреля 2017
clientDetail.addActionListener(new ActionListener(){
    public void actionPerformed (ActionEvent e){

        d.getContentPane().removeAll();
        g = new GridBagLayout();
        gc = new GridBagConstraints();

        d.setLayout(g);
        JLabel message= new JLabel(" Message");
        addComponent(message,5,1,1,2);
        JTextArea Message = new JTextArea();
        addComponent(Message,5,1,1,2);

        d.setVisible(true);

        d.setVisible(true);
        d.pack();

        } 

        private void addComponent(Component component, int i, int i0, int i1, int i2) {

        gc.gridx=i;
        gc.gridy=i0;  
        gc.gridheight=i1;
        gc.gridwidth=i2;
        g.setConstraints(component, gc);
        add(component);

        }


});

Recep.addActionListener(new ActionListener(){

    public void actionPerformed(ActionEvent e){

        }

});
0 голосов
/ 27 июня 2012

сначала вы не добавляете само изображение в JLabel.

просто создайте объект и оставьте его как ..

ImageIcon image1 = new ImageIcon(this.getClass().getResource(apple));
JLabel label1 = new JLabel("");
label1.setVisible(true);

, затем сделайте изменение в действии, выполненном общедоступнымvoid actionPerformed (ActionEvent e) {

if (e.getSource() == button1) 
{

    field1.seticon(image1);
    field1.revalidate();
}

это определенно будет работать

...