在三个类之间传递信息,抛出异常。 (JAVA)

时间:2014-01-20 23:41:07

标签: java swing jbutton actionlistener

我前几天提到了一个关于类似问题的话题,我以为我已经解决了它但是当我尝试接受用户建议并将我的代码拆分为更符合OO的代码时,我只是继续遇到同样的异常

首先,我有一个'main'类,它加载一个JFrame,然后加载一个ComboBox类的实例和一个runButton类的实例。一旦显示这些,它就会运行一个while循环,等待来自运行按钮的特定响应,然后加载相应的Web驱动程序。

这是驱动程序类。

public class DynamicBrowsers {

public static void main(String[] args) {


    BrowserBox b = new BrowserBox();
    GoButton g = new GoButton();
    JFrame IDE = new JFrame("IDE");
    IDE.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
    IDE.setContentPane(b);
    IDE.add(g);
    IDE.setPreferredSize(new Dimension(200, 100));
    IDE.pack();
    IDE.setVisible(true);

    WebDriver driver = null;    

    while (g.browserValue == 0){
        if(g.browserValue == 1){
            driver = new FirefoxDriver();
            System.out.println("FF!");
            break;
        }else if(g.browserValue == 2){
            driver = new ChromeDriver();
            System.out.println("Chrome!");
            break;
        }else if(g.browserValue == 3){
            driver = new InternetExplorerDriver();
            System.out.println("IE!");
            break;
        }
    }

本课程中还有更多内容,但它不相关,主要是我测试我在Selenium中可以做些什么。

它从中读取的类是BrowserBox类,它实现了一个组合框,代码为: -

public class BrowserBox extends JPanel {

public String browserPick;
String[] browsers = {"Please Select a Browser","Mozilla", "Chrome", "IE"};
public JComboBox browserPicker = new JComboBox(browsers);     

public BrowserBox() { 

    add(browserPicker);

    ActionListener cbActionListener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent listChoice) {

            String s = (String) browserPicker.getSelectedItem();//get the selected item

            switch (s) {//check for a match

                case "Please Select a Browser":
                    browserPick = "Please Select a Browser";
                    System.out.println(browserPick);
                    break;                
                case "Mozilla":                     
                    browserPick = "Mozilla";
                    System.out.println("Could have been a worse choice than " + browserPick);
                    break;
                case "Chrome":
                    browserPick = "Chrome";
                    System.out.println("Good choice picking " + browserPick);
                    break;
                case "IE":
                   browserPick = "IE";
                    System.out.println("For some reason you chose " + browserPick);
                    break;
                default:
                    browserPick = "Please Select a Browser";
                    System.out.println("No match selected, defaulting too " + browserPick);
                    break;
            } 
        }            
    };

    browserPicker.addActionListener(cbActionListener);

}
}  

最后按钮,GoButton类: -

public class GoButton extends JButton {

public int browserValue = 0;
JButton runButton = new JButton("Run Test");
BrowserBox cb = new BrowserBox();

public GoButton() {

    add(runButton); 

    ActionListener bActionListener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent runClicked) {

            if (cb.browserPick.equals("Mozilla")){
                browserValue = 1;     
                System.out.println("FF clicked " + browserValue);
            }
            else if (cb.browserPick.equals("Chrome")){
                browserValue = 2;
                System.out.println("Chrome clicked " + browserValue);
            }
            else if (cb.browserPick.equals("IE")){
                browserValue = 3;
                System.out.println("IE clicked " + browserValue);
            } 

        }

    };
    runButton.addActionListener(bActionListener);
}

}

这是我得到异常的地方

线程“AWT-EventQueue-0”中的异常java.lang.NullPointerException     在GoButton $ 1.actionPerformed(GoButton.java:21)

我认为问题是browserPick的值不会改变我对它的预期方式,这意味着该值为null,因此不是我想要的,但我无法解决原因。或者如何解决它。

如果我的问题很烦人,或者我做的事情非常愚蠢,我很抱歉。在我深入了解更多Selenium之前,试着在周围的Java中取得好成绩。

谢谢你, 法雷尔

2 个答案:

答案 0 :(得分:1)

GoButton班级中,您正在创建BrowswerBox

的新实例
BrowserBox cb = new BrowserBox();

与您添加到框架中的实例无关...

BrowserBox b = new BrowserBox();
GoButton g = new GoButton();
JFrame IDE = new JFrame("IDE");
IDE.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
IDE.setContentPane(b);
IDE.add(g);
IDE.setPreferredSize(new Dimension(200, 100));
IDE.pack();
IDE.setVisible(true);

JButton延伸实际上是矫枉过正。不仅如此,你还在其中创建了另一个JButton的实例,并将其添加到按钮中?

您只需将ActionListener目录添加到gGoButton的实例),该目录将有更多容量来引用BrowserButton的正确实例

例如......

final BrowserBox b = new BrowserBox();
JButton g = new JButton("Run Test");
JFrame IDE = new JFrame("IDE");
IDE.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
IDE.setContentPane(b);
IDE.add(g);
IDE.setPreferredSize(new Dimension(200, 100));
IDE.pack();
IDE.setVisible(true);

g.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent runClicked) {
        WebDriver driver = null;
        if ("Mozilla".equals(b.browserPick)){
            driver = new FirefoxDriver();
            System.out.println("FF clicked " + browserValue);
        }
        else if ("Chrome".equals(b.browserPick)){
            System.out.println("Chrome clicked " + browserValue);
            driver = new ChromeDriver();
        }
        else if ("IE".equals(b.browserPick)){
            System.out.println("IE clicked " + browserValue);
            driver = new InternetExplorerDriver();
        } 
        if (driver != null) {
            // Drive away...
        }
    }
 });

我的下一个关注点是,您将browserPicker公开为public,任何人都可以更改可用值,删除它,替换它并做一些令人讨厌的事情。

就个人而言,我简单地将“开始测试”按钮作为BrowswerBox窗格的一部分包含在内,并确保组件具有private访问权限。如果需要,我会提供某种吸气剂来返回所选项目的值......

我建议您花一些时间阅读Creating a GUI With JFC/Swing,您可能会发现Initial Threads也很有趣。

<强>更新

我还应该提到这个:

while (g.browserValue == 0){
    if(g.browserValue == 1){
        driver = new FirefoxDriver();
        System.out.println("FF!");
        break;
    }else if(g.browserValue == 2){
        driver = new ChromeDriver();
        System.out.println("Chrome!");
        break;
    }else if(g.browserValue == 3){
        driver = new InternetExplorerDriver();
        System.out.println("IE!");
        break;
    }
}

不是您对GUI环境中用户交互/更改的反应方式。大多数GUI都是事件驱动的,也就是说,用户做了某些事情并且你做出了反应。我已将前一个示例中的ActionListener更新为更“准确”

答案 1 :(得分:0)

如果您尚未选择浏览器,则browserPick将为null。变量为null时不应导致NullPointerException。我想你可能希望它是“请选择一个浏览器”......