我使用两个方法创建一个简单视图,第一个方法将面板上的所有组件放入hashmap,第二个按名称使用hashmap获取组件:
public class AddMaker extends JFrame {
private static HashMap componentMap;
//first
private void createComponentMap(JPanel jPanel) {
componentMap = new HashMap<String,Component>();
Component[] components = jPanel.getComponents();
for (int i=0; i < components.length; i++) {
componentMap.put(i, components[i].getName());
}
}
//second
public static Component getComponentByName(String name) {
if (componentMap.containsValue(name)) {
System.out.println("name " + name );
return (Component) componentMap.get(name);
}
else return null;
}
private JPanel jPanel = new JPanel();
//labels
private JLabel jLabel1 = new JLabel("Add");
public AddMaker(){
setSize(400, 300);
setResizable(false);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//set panel layout
jPanel.setLayout(new BoxLayout(jPanel, BoxLayout.Y_AXIS));
//do some align
jLabel1.setName("namee");
jLabel1.setAlignmentX(Component.CENTER_ALIGNMENT);
jPanel.add(jLabel1);
//creating hashmap with components on panel
createComponentMap(jPanel);
//add panel on form
getContentPane().add(jPanel);
}
在我的控制器中,我想获得一些组件并与他做点什么:
public class AddMakerController {
public JFrame addMaker = new AddMaker();
public AddMakerController(){
JLabel jLabel = (JLabel) AddMaker.getComponentByName("namee");
addMaker.setVisible(false);
}
}
但是当表单打开时,出现此错误,有人有想法吗?
name namee
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at mvc.controller.AddMakerController.<init>(AddMakerController.java:18)
at mvc.controller.CountryController$1.actionPerformed(CountryController.java:300)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
...
修改 我处理这个异常,我的代码在控制器中:
public class AddMakerController {
public AddMaker addMaker = new AddMaker();
public AddMakerController(){
Component component = addMaker.getComponentByName("namee");
if (component instanceof JLabel) {
JLabel jLabel = (JLabel) component;
jLabel.setText("l");
addMaker =new AddMaker(); //not edit label on form..
}
}
}
现在,我想更改标签中的文本,如何在控制器中显示此操作的结果?
感谢。