2014-01-20 41 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進行通信類。對不起,這是一個爛攤子,謝謝你的幫助。 –