Keith Kaplan
Keith Kaplan

Reputation: 109

Set JLabel Visible when JButton is clicked in actionPerformed

I am trying to get a JLabel to appear when a JButton is clicked. I have added an action listener and added the component to the layout. I am using the label1.setVisible(true) when the JButton is clicked in actionPerformed. I still can't get it work. Can some look at my code?

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");
    }

}

 }

I have my main method in another class file. The error I get leads me to the label1.setVisible(true);

Every question I've seen they say to do this, but I'm wondering if there is something else that needs to be added.

Upvotes: 4

Views: 32539

Answers (3)

Temidayo Adebanjo
Temidayo Adebanjo

Reputation: 1

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){

        }

});

Upvotes: -1

icyrock.com
icyrock.com

Reputation: 28608

There were a couple of issues here:

  • Your label1 was hidden by doing JLabel label in the constructor. You basically declared another variable called label1 in your constructor that hid the one in the class itself.
  • Your label was visible on the startup - I used label.setVisible(false) for the test, but you might want otherwise

I also put the creation of Image aside as I did not have an image, so uncomment that and change as appropriate.

Here's a complete working version:

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();
}
}

I'd suggest using separate (usually inner-class) ActionListener instances instead of overriding actionPerformed. See e.g. this for a similar example if you are interested:

Also, if you are using this in a bigger application (i.e. not just experimenting or for prototyping), make sure all Swing code is run on EDT.

You typically use SwingUtilities.invokeLater for that purpose.

Hope this helps.

Upvotes: 5

padman
padman

Reputation: 501

first you don't add the image first itself to JLabel.

just create the object and leave it like..

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

then do the modification in the action performed public void actionPerformed(ActionEvent e) {

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

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

it will definitely works

Upvotes: 0

Related Questions