Get a Swing Component by Name

Get a Swing component by name

I know this is an old question, but I found myself asking it just now. I wanted an easy way to get components by name so I didn't have to write some convoluted code each time to access different components. For example, having a JButton access the text in a text field or a selection in a List.

The easiest solution is to make all of the component variables be class variables so that you can access them anywhere. However, not everyone wants to do that, and some (like myself) are using GUI Editors that don't generate the components as class variables.

My solution is simple, I'd like to think, and doesn't really violate any programming standards, as far as I know (referencing what fortran was getting at). It allows for an easy and straightforward way to access components by name.

  1. Create a Map class variable. You'll need to import HashMap at the
    very least. I named mine componentMap for simplicity.

    private HashMap componentMap;
  2. Add all of your components to the frame as normal.

    initialize() {
    //add your components and be sure
    //to name them.
    ...
    //after adding all the components,
    //call this method we're about to create.
    createComponentMap();
    }
  3. Define the following two methods in your class. You'll need to import Component if you haven't already:

    private void createComponentMap() {
    componentMap = new HashMap<String,Component>();
    Component[] components = yourForm.getContentPane().getComponents();
    for (int i=0; i < components.length; i++) {
    componentMap.put(components[i].getName(), components[i]);
    }
    }

    public Component getComponentByName(String name) {
    if (componentMap.containsKey(name)) {
    return (Component) componentMap.get(name);
    }
    else return null;
    }
  4. Now you've got a HashMap that maps all the currently existing components in your frame/content pane/panel/etc to their respective names.

  5. To now access these components, it is as simple as a call to getComponentByName(String name). If a component with that name exists, it will return that component. If not, it returns null. It is your responsibility to cast the component to the proper type. I suggest using instanceof to be sure.

If you plan on adding, removing, or renaming components at any point during runtime, I would consider adding methods that modify the HashMap according to your changes.

How to get component name in swing?

You are setting the name only for textArea. For all three components you are using the same statement: textArea.setName("groupList"); Change it to:

JTextArea textArea = new JTextArea();
textArea.setName("groupList");
JTextArea textArea1 = new JTextArea();
textArea1.setName("groupList1");
JTextArea textArea2 = new JTextArea();
textArea2.setName("groupList2");

How can I get the Class name from a swing Component?

how can I print the class name from the component

component.getClass().getName();

How to get all elements inside a JFrame?

You can write a recursive method and recurse on every container:

This site provides some sample code:

public static List<Component> getAllComponents(final Container c) {
Component[] comps = c.getComponents();
List<Component> compList = new ArrayList<Component>();
for (Component comp : comps) {
compList.add(comp);
if (comp instanceof Container)
compList.addAll(getAllComponents((Container) comp));
}
return compList;
}

If you only want the components of the immediate sub-components, you could limit the recursion depth to 2.

Search JPanel by name

I added a method to the MainPanel class to return a JPanel when you pass a String. I don't use the method, but it's there.

I made all the additional classes inner classes so I could post the code as one block.

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class CardPanelExample implements Runnable {

public static void main(String[] args) {
SwingUtilities.invokeLater(new CardPanelExample());
}

private final MainPanel mainPanel;

public CardPanelExample() {
this.mainPanel = new MainPanel(this);
}

@Override
public void run() {
JFrame frame = new JFrame("CardPanel Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(mainPanel.getPanel(), BorderLayout.CENTER);

frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public void setNextPanel() {
mainPanel.setNextPanel();
}

public JPanel getPanelFromName(String name) {
return mainPanel.getPanelFromName(name);
}

public class MainPanel {

private final CardLayout cardLayout;

private final JPanel panel;
private JPanel yellowPanel, orangePanel, whitePanel;

private final String[] panelStrings;
private String currentPanelString;

public MainPanel(CardPanelExample view) {
this.cardLayout = new CardLayout();
this.panelStrings = new String[] { "alpha", "beta", "gamma" };
this.currentPanelString = panelStrings[0];
this.panel = createMainPanel(view, cardLayout, panelStrings);
}

private JPanel createMainPanel(CardPanelExample view,
CardLayout cardLayout, String[] panelStrings) {
this.yellowPanel = new ColorPanel(view, Color.YELLOW).getPanel();
this.orangePanel = new ColorPanel(view, Color.ORANGE).getPanel();
this.whitePanel = new ColorPanel(view, Color.WHITE).getPanel();

JPanel panel = new JPanel(cardLayout);
panel.add(yellowPanel, panelStrings[0]);
panel.add(orangePanel, panelStrings[1]);
panel.add(whitePanel, panelStrings[2]);

return panel;
}

public JPanel getPanelFromName(String name) {
if (name.equals(panelStrings[0])) {
return yellowPanel;
} else if (name.equals(panelStrings[1])) {
return orangePanel;
} else if (name.equals(panelStrings[2])) {
return whitePanel;
} else {
return null;
}
}


public void setNextPanel() {
for (int index = 0; index < panelStrings.length; index++) {
if (currentPanelString.equals(panelStrings[index])) {
index = ++index % panelStrings.length;
currentPanelString = panelStrings[index];
cardLayout.show(panel, currentPanelString);
return;
}
}
}

public JPanel getPanel() {
return panel;
}

}

public class ColorPanel {

private final JPanel panel;

public ColorPanel(CardPanelExample view, Color backgroundColor) {
this.panel = createMainPanel(view, backgroundColor);
}

private JPanel createMainPanel(CardPanelExample view, Color backgroundColor) {
JPanel panel = new JPanel(new FlowLayout());
panel.setBackground(backgroundColor);
panel.setBorder(BorderFactory.createEmptyBorder(25, 150, 25, 150));

JButton button = new JButton("Next Panel");
button.addActionListener(new ButtonListener(view));
panel.add(button);

return panel;
}

public JPanel getPanel() {
return panel;
}

}

public class ButtonListener implements ActionListener {

private final CardPanelExample view;

public ButtonListener(CardPanelExample view) {
this.view = view;
}

@Override
public void actionPerformed(ActionEvent event) {
view.setNextPanel();
}

}

}


Related Topics



Leave a reply



Submit