Buttons and Event Handlers

Discussion in 'Java' started by Nessuno, Feb 21, 2010.

  1. Nessuno

    Nessuno Guest

    Hi,

    I am a newbie in Java. While learning from the Horstmann I have
    modified a little example from the book. The problem is that the
    buttons it creates are never shown.

    Please, would someone explain what I am missing? The code follows.
    Thanks in advance to everyone who will reply.

    fabio

    ButtonTest.java

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

    public class ButtonTest
    {
    public static void main( String[] args )
    {
    EventQueue.invokeLater(new Runnable()
    {
    public void run()
    {
    ButtonFrame frame = new ButtonFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    });
    }
    }

    @SuppressWarnings("serial")
    class ButtonFrame extends JFrame
    {
    public ButtonFrame()
    {
    setTitle("ButtonTest");
    setSize(300, 200);
    buttonPanel = new JPanel();
    makeButton("Red", Color.RED);
    makeButton("Green", Color.GREEN);
    makeButton("Blue", Color.BLUE);
    }

    private void makeButton(String name, final Color backgroundColor)
    {
    JButton button = new JButton(name);
    buttonPanel.add(button);
    button.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent event)
    {
    buttonPanel.setBackground(backgroundColor);
    }

    });

    }

    private JPanel buttonPanel;
    }
     
    Nessuno, Feb 21, 2010
    #1
    1. Advertisements

  2. You make a buttonPanel and then... never add it to anything? So all of
    your buttons are now on some panel which is never attached to anything else.
     
    Joshua Cranmer, Feb 21, 2010
    #2
    1. Advertisements

  3. add(buttonPanel);
    You need to add the buttonPanel to the JFrame.
     
    Knute Johnson, Feb 21, 2010
    #3
  4. Nessuno

    markspace Guest

    frame.pack();

    The OP should also call pack() on the frame before it is displayed.
     
    markspace, Feb 22, 2010
    #4
  5. He calls setSize() in the JFrame constructor. Not the best method but
    it does work in this instance.
     
    Knute Johnson, Feb 22, 2010
    #5
  6. Nessuno

    Roedy Green Guest

    See http://mindprod.com/jgloss/jbutton.html
    and
    http://mindprod.com/jgloss/button.html

    for some similar sample code that does work.

    Hint: Every Component except the Frame/JFrame must be added to some
    container to be visible.
    --
    Roedy Green Canadian Mind Products
    http://mindprod.com

    When a newbie asks for help tracking a bug in a code snippet, the problem is usually is the code he did not post, hence the value of an SSCCE.
    see http://mindprod.com/jgloss/sscce.html
     
    Roedy Green, Feb 22, 2010
    #6
  7. Nessuno

    markspace Guest


    Thanks, I'd missed that. I think I might recommend calling pack() after
    adding all components, then calling setMinimumSize() instead of
    setSize(). That'll prevent the components from clipping if they take
    more space, but will enlarge the window if it happens to be smaller.
     
    markspace, Feb 22, 2010
    #7
  8. Nessuno

    Lew Guest

    As others have answered your question, I will only add that you should not
    indent Usenet code examples with TAB characters, as they get ridiculously wide
    for most newsreaders and gravely harm readability. You want your code to be
    readable. Please use spaces, up to a maximum of four per indent level, for
    indentation.
     
    Lew, Feb 22, 2010
    #8
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.