Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / May 2007

Tip: Looking for answers? Try searching our database.

Applet - Creating new objects from a Button Listener

Thread view: 
theneb - 22 Apr 2007 23:20 GMT
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
Tom Hawtin - 23 Apr 2007 00:25 GMT
> 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
SadRed - 23 Apr 2007 00:31 GMT
> Hello everyone, I'm attempting to create JComponents from when a
> button is clicked. However I'm assuming I'm missing something? (Or
[quoted text clipped - 50 lines]
>
> 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
Knute Johnson - 23 Apr 2007 00:34 GMT
> Hello everyone, I'm attempting to create JComponents from when a
> button is clicked. However I'm assuming I'm missing something? (Or
[quoted text clipped - 51 lines]
>
> 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();
        }
    }
}

Signature

Knute Johnson
email s/nospam/knute/

theneb - 05 May 2007 15:07 GMT
On 23 Apr, 00:34, Knute Johnson <nos...@rabbitbrush.frazmtn.com>
wrote:
> thenebwrote:
> > Hello everyone, I'm attempting to create JComponents from when a
[quoted text clipped - 99 lines]
> Knute Johnson
> email s/nospam/knute/

Appoligies for a late reply, thanks to all. My code now fully works.


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.