如何在控制器(Swing)中使用组件?

时间:2015-02-21 17:57:56

标签: java swing view controller components

我使用两个方法创建一个简单视图,第一个方法将面板上的所有组件放入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..
    }
}
}

现在,我想更改标签中的文本,如何在控制器中显示此操作的结果?

感谢。

0 个答案:

没有答案