Applet - Creating new objects from a Button Listener

Discussion in 'Java' started by theneb, Apr 22, 2007.

  1. theneb

    theneb Guest

    Hello everyone, I'm attempting to create JComponents from when a
    button is clicked. However I'm assuming I'm missing something? (Or
    it's not possible)

    This is some quick prototype code which shows my intentions.

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

    public class myApplet extends Applet implements ActionListener{

    private JPanel buttonPanel;
    private HashMap<String,testButton> buttons;

    private testButton myButton, secondButton, thirdButton;

    public void init(){
    buttonPanel = new JPanel();
    buttons = new HashMap<String,testButton>();
    buttons.put(String.valueOf(buttons.size()),new testButton());
    buttonPanel.add(buttons.get(String.valueOf(buttons.size()-1)));
    add(buttonPanel);
    }//end init

    public void start(){
    System.out.println("START");
    }

    public void actionPerformed(ActionEvent event) {
    System.out.println("Action");
    }


    private class testButton extends JButton implements ActionListener{


    public testButton(){
    setText("Button "+buttons.size());
    addActionListener(this);
    }

    public void actionPerformed(ActionEvent event) {
    System.out.println("Adding New Button");
    buttons.put(String.valueOf(buttons.size()),new testButton());
    buttonPanel.add(buttons.get(String.valueOf(buttons.size()-1)));
    }

    }

    }//end myApplet


    Example here: http://www.theneb.co.uk/applet-test/test.html

    Cheers
    theneb, Apr 22, 2007
    #1
    1. Advertising

  2. theneb

    Tom Hawtin Guest

    theneb wrote:
    > Hello everyone, I'm attempting to create JComponents from when a
    > button is clicked. However I'm assuming I'm missing something? (Or
    > it's not possible)


    From the java.awt.Container.add API docs:

    "Note: If a component has been added to a container that has been
    displayed, validate must be called on that container to display the new
    component. If multiple components are being added, you can improve
    efficiency by calling validate only once, after all the components have
    been added."


    > public class myApplet extends Applet implements ActionListener{


    Much better to use anonymous inner classes for listeners, otherwise you
    will have a mess. (And initial caps for type names.)

    > private HashMap<String,testButton> buttons;


    This can just be Map.

    > buttons.put(String.valueOf(buttons.size()),new testButton());
    > buttonPanel.add(buttons.get(String.valueOf(buttons.size()-1)));


    That's just confusing.

    > public void actionPerformed(ActionEvent event) {


    Never used...

    > private class testButton extends JButton implements ActionListener{


    Again, don't do listeners like that. And you don't need to extend
    JButton at all.

    public class MyApplet extends Applet {

    private final Map<String,JButton> buttons =
    new HashMap<String,JButton>();

    private JPanel buttonPanel;

    public void init() {
    buttonPanel = new JPanel();
    addButton();
    }

    private void addButton() {
    String id = String.valueOf(buttons.size());
    JButton button = new JButton(id);
    button.addActionListener(new ActionListener {
    public void actionPerformed(ActionEvent event) {
    addButton();
    }
    });
    buttons.put(id, button);
    buttonPanel.add(button);
    buttonPanel.validate();
    }
    }


    (Disclaimer: Not compiled or tested.)

    Tom Hawtin
    Tom Hawtin, Apr 23, 2007
    #2
    1. Advertising

  3. theneb

    SadRed Guest

    On Apr 23, 7:20 am, theneb <> wrote:
    > Hello everyone, I'm attempting to create JComponents from when a
    > button is clicked. However I'm assuming I'm missing something? (Or
    > it's not possible)
    >
    > This is some quick prototype code which shows my intentions.
    >
    > import java.awt.*;
    > import javax.swing.*;
    > import java.applet.*;
    > import java.awt.event.*;
    > import java.util.*;
    >
    > public class myApplet extends Applet implements ActionListener{
    >
    > private JPanel buttonPanel;
    > private HashMap<String,testButton> buttons;
    >
    > private testButton myButton, secondButton, thirdButton;
    >
    > public void init(){
    > buttonPanel = new JPanel();
    > buttons = new HashMap<String,testButton>();
    > buttons.put(String.valueOf(buttons.size()),new testButton());
    > buttonPanel.add(buttons.get(String.valueOf(buttons.size()-1)));
    > add(buttonPanel);
    > }//end init
    >
    > public void start(){
    > System.out.println("START");
    > }
    >
    > public void actionPerformed(ActionEvent event) {
    > System.out.println("Action");
    > }
    >
    > private class testButton extends JButton implements ActionListener{
    >
    > public testButton(){
    > setText("Button "+buttons.size());
    > addActionListener(this);
    > }
    >
    > public void actionPerformed(ActionEvent event) {
    > System.out.println("Adding New Button");
    > buttons.put(String.valueOf(buttons.size()),new testButton());
    > buttonPanel.add(buttons.get(String.valueOf(buttons.size()-1)));
    > }
    >
    > }
    > }//end myApplet
    >
    > Example here:http://www.theneb.co.uk/applet-test/test.html
    >
    > Cheers


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

    public class MyApplet extends JApplet{
    private JPanel buttonPanel;
    private HashMap<String,TestButton> buttons;
    private TestButton myButton, secondButton, thirdButton;

    public void init(){
    buttonPanel = new JPanel();
    buttons = new HashMap<String, TestButton>();
    buttons.put(String.valueOf(buttons.size()), new TestButton());
    buttonPanel.add(buttons.get(String.valueOf(buttons.size()-1)));
    getContentPane().add(buttonPanel, BorderLayout.CENTER);
    }//end init

    private class TestButton extends JButton implements ActionListener{

    public TestButton(){
    setText("Button " + buttons.size());
    addActionListener(this);
    }

    public void actionPerformed(ActionEvent event) {
    System.out.println("Adding New Button");
    buttons.put(String.valueOf(buttons.size()), new TestButton());
    buttonPanel.add(buttons.get(String.valueOf(buttons.size() -
    1)));
    buttonPanel.revalidate();
    }
    }
    }//end MyApplet
    SadRed, Apr 23, 2007
    #3
  4. theneb wrote:
    > Hello everyone, I'm attempting to create JComponents from when a
    > button is clicked. However I'm assuming I'm missing something? (Or
    > it's not possible)
    >
    > This is some quick prototype code which shows my intentions.
    >
    > import java.awt.*;
    > import javax.swing.*;
    > import java.applet.*;
    > import java.awt.event.*;
    > import java.util.*;
    >
    > public class myApplet extends Applet implements ActionListener{
    >
    > private JPanel buttonPanel;
    > private HashMap<String,testButton> buttons;
    >
    > private testButton myButton, secondButton, thirdButton;
    >
    > public void init(){
    > buttonPanel = new JPanel();
    > buttons = new HashMap<String,testButton>();
    > buttons.put(String.valueOf(buttons.size()),new testButton());
    > buttonPanel.add(buttons.get(String.valueOf(buttons.size()-1)));
    > add(buttonPanel);
    > }//end init
    >
    > public void start(){
    > System.out.println("START");
    > }
    >
    > public void actionPerformed(ActionEvent event) {
    > System.out.println("Action");
    > }
    >
    >
    > private class testButton extends JButton implements ActionListener{
    >
    >
    > public testButton(){
    > setText("Button "+buttons.size());
    > addActionListener(this);
    > }
    >
    > public void actionPerformed(ActionEvent event) {
    > System.out.println("Adding New Button");
    > buttons.put(String.valueOf(buttons.size()),new testButton());
    > buttonPanel.add(buttons.get(String.valueOf(buttons.size()-1)));
    > }
    >
    > }
    >
    > }//end myApplet
    >
    >
    > Example here: http://www.theneb.co.uk/applet-test/test.html
    >
    > Cheers
    >


    After you add or remove components from a container you need to call
    validate() and usually repaint(). This will cause the LayoutManager to
    re-layout your components. If your containers are JComponents (which
    JApplet is not) you can call revalidate() on the container to have the
    LayoutManager re-layout the component.

    Also, you are using JButtons and an Applet. You should not mix AWT and
    Swing components. If you are going to use JButtons, use a JApplet.

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

    public class test extends JApplet {
    public void init() {
    setLayout(new FlowLayout());

    JButton add = new JButton("Add a Button");
    add.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
    test.this.add(new Tutton("Press Me"));
    test.this.validate();
    test.this.repaint();
    }
    });
    add(add);
    }

    class Tutton extends JButton implements ActionListener {
    public Tutton(String text) {
    super(text);
    addActionListener(this);
    }
    public void actionPerformed(ActionEvent ae) {
    test.this.remove((JComponent)ae.getSource());
    test.this.validate();
    test.this.repaint();
    }
    }
    }

    --

    Knute Johnson
    email s/nospam/knute/
    Knute Johnson, Apr 23, 2007
    #4
  5. theneb

    theneb Guest

    On 23 Apr, 00:34, Knute Johnson <>
    wrote:
    > thenebwrote:
    > > Hello everyone, I'm attempting to create JComponents from when a
    > > button is clicked. However I'm assuming I'm missing something? (Or
    > > it's not possible)

    >
    > > This is some quick prototype code which shows my intentions.

    >
    > > import java.awt.*;
    > > import javax.swing.*;
    > > import java.applet.*;
    > > import java.awt.event.*;
    > > import java.util.*;

    >
    > > public class myApplet extends Applet implements ActionListener{

    >
    > > private JPanel buttonPanel;
    > > private HashMap<String,testButton> buttons;

    >
    > > private testButton myButton, secondButton, thirdButton;

    >
    > > public void init(){
    > > buttonPanel = new JPanel();
    > > buttons = new HashMap<String,testButton>();
    > > buttons.put(String.valueOf(buttons.size()),new testButton());
    > > buttonPanel.add(buttons.get(String.valueOf(buttons.size()-1)));
    > > add(buttonPanel);
    > > }//end init

    >
    > > public void start(){
    > > System.out.println("START");
    > > }

    >
    > > public void actionPerformed(ActionEvent event) {
    > > System.out.println("Action");
    > > }

    >
    > > private class testButton extends JButton implements ActionListener{

    >
    > > public testButton(){
    > > setText("Button "+buttons.size());
    > > addActionListener(this);
    > > }

    >
    > > public void actionPerformed(ActionEvent event) {
    > > System.out.println("Adding New Button");
    > > buttons.put(String.valueOf(buttons.size()),new testButton());
    > > buttonPanel.add(buttons.get(String.valueOf(buttons.size()-1)));
    > > }

    >
    > > }

    >
    > > }//end myApplet

    >
    > > Example here:http://www.theneb.co.uk/applet-test/test.html

    >
    > > Cheers

    >
    > After you add or remove components from a container you need to call
    > validate() and usually repaint(). This will cause the LayoutManager to
    > re-layout your components. If your containers are JComponents (which
    > JApplet is not) you can call revalidate() on the container to have the
    > LayoutManager re-layout the component.
    >
    > Also, you are using JButtons and an Applet. You should not mix AWT and
    > Swing components. If you are going to use JButtons, use a JApplet.
    >
    > import java.awt.*;
    > import java.awt.event.*;
    > import javax.swing.*;
    >
    > public class test extends JApplet {
    > public void init() {
    > setLayout(new FlowLayout());
    >
    > JButton add = new JButton("Add a Button");
    > add.addActionListener(new ActionListener() {
    > public void actionPerformed(ActionEvent ae) {
    > test.this.add(new Tutton("Press Me"));
    > test.this.validate();
    > test.this.repaint();
    > }
    > });
    > add(add);
    > }
    >
    > class Tutton extends JButton implements ActionListener {
    > public Tutton(String text) {
    > super(text);
    > addActionListener(this);
    > }
    > public void actionPerformed(ActionEvent ae) {
    > test.this.remove((JComponent)ae.getSource());
    > test.this.validate();
    > test.this.repaint();
    > }
    > }
    >
    > }
    >
    > --
    >
    > Knute Johnson
    > email s/nospam/knute/




    Appoligies for a late reply, thanks to all. My code now fully works.
    theneb, May 5, 2007
    #5
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ben
    Replies:
    22
    Views:
    1,109
    Chris Uppal
    Feb 17, 2006
  2. Replies:
    4
    Views:
    585
  3. 7stud
    Replies:
    11
    Views:
    673
    Dennis Lee Bieber
    Mar 20, 2007
  4. News123
    Replies:
    7
    Views:
    371
    Dave Angel
    Jun 29, 2009
  5. Daz
    Replies:
    5
    Views:
    482
Loading...

Share This Page