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.
Create a Map class variable. You'll need to import HashMap at the
very least. I named mine componentMap for simplicity.private HashMap componentMap;
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();
}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;
}Now you've got a HashMap that maps all the currently existing components in your frame/content pane/panel/etc to their respective names.
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
Why Doesn't a Missing Annotation Cause a Classnotfoundexception at Runtime
Convert a String of Hex into Ascii in Java
How to Change Timezone for a Java.Util.Calendar/Date
Double Calculation Producing Odd Result
Why Do == Comparisons with Integer.Valueof(String) Give Different Results for 127 and 128
Can't Cast to to Unspecific Nested Type with Generics
Escaping Special Characters in Java Regular Expressions
Calling Superclass from a Subclass Constructor in Java
Servlet Seems to Handle Multiple Concurrent Browser Requests Synchronously
Spring Autowiring Class VS. Interface
Hexadecimal to Integer in Java
How to Call a Method in Another Class of the Same Package
Variable Naming Conventions in Java
Consider Defining a Bean of Type 'Package' in Your Configuration [Spring-Boot]
Strange Java Null Behavior in Method Overloading