2014-01-20 39 views
0

我前几天就一个类似的问题做了一个主题,我想我已经解决了它,但是当我试图接受用户建议并将我的代码拆分为更符合OO的代码时,我只是继续运行同样的例外。传递三个类之间的信息,抛出异常。 (Java)

首先,我有我的'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; 
     } 
    } 

这个班有更多,但它是无关的,大多数只是我测试我可以在硒做什么。

它读取类是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(Go Button.java:21)

我认为问题是browserPick的值不会改变我期待它的方式,这意味着值为空,因此不是我正在寻找的东西,但我无法工作为什么。或者如何解决它。

对不起,如果我的问题很烦人,或者我正在做一些非常愚蠢的事情。试图在我深入研究更多硒之前,在周围的爪哇地区找到一片好地方。

谢谢 法雷尔

+0

您是否听说过Safari?这是最好的。不是Chrome。 – tbodt

回答

0

如果您还没有选择了一个浏览器,然后browserPicknull。当它不应该导致NullPointerException时,变量是null。我想你可能会希望它是“请选择一个浏览器” ......

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目录g(的GoButton实例),这将有参考的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... 
     } 
    } 
}); 

我关注的下一个点就是事实,你暴露browserPickerpublic,因此任何人可以改变的可用值,将其删除,替换它,做一般讨厌的东西。

就我个人而言,我会简单地将“开始测试”按钮作为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环境的变化。大多数图形用户界面都是事件驱动的,也就是说,用户做了一些事情,并对其做出反应。我更新了前面示例中的ActionListener以更“精确”

+0

哇真的有用的建议,我会明天阅读这些链接。如果我有足够的代表赞成你,我会笑。当我尝试将g.addActionListener(new ActionListener(){line in in,认为它只是缺少a)时出现大错误,但也失败了。 –

+0

它可能会得到一些“超出范围”变量引用。我已经更新了示例以更准确地说明GUI应该如何工作 – MadProgrammer

+0

非常感谢,我想明天我会做更多的阅读,然后可能从头开始使用您的方法在这里和getters/setters进行通信类。对不起,这是一个烂摊子,谢谢你的帮助。 –