2016-03-15 40 views
-5

我只是試圖通過switch語句獲取事件源,但我不能。我越來越:switch語句所需的常量表達式

常量表達式需要

我在做什麼錯?它甚至有可能嗎?

import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Main extends JFrame implements ActionListener { 

    JButton poteguj; 
    JLabel podstawa, wykladnik, wynik; 
    JTextField tPodstawa, tWykladnik; 
    JCheckBox odwroc; 
    int liczba1, liczba2; 
    long wynikLiczb; 

    public Main() { 
     setTitle("Poteegpowanie"); 
     setSize(400, 250); 
     setLayout(null); 

     podstawa = new JLabel("Wprowadz podstawe:"); 
     podstawa.setBounds(20, 40, 150, 20); 
     add(podstawa); 

     tPodstawa = new JTextField(""); 
     tPodstawa.setBounds(170, 40, 150, 20); 
     add(tPodstawa); 

     wykladnik = new JLabel("Wprowadz wykladnik:"); 
     wykladnik.setBounds(20, 70, 150, 20); 
     add(wykladnik); 

     tWykladnik = new JTextField(""); 
     tWykladnik.setBounds(170, 70, 150, 20); 
     add(tWykladnik); 

     poteguj = new JButton("Poteguj!"); 
     poteguj.setBounds(130, 120, 100, 40); 
     add(poteguj); 
     poteguj.addActionListener(this); 

     wynik = new JLabel("Wynik: "); 
     wynik.setBounds(0, 160, 400, 20); 
     add(wynik); 

     odwroc = new JCheckBox("Odwroc dzialanie"); 
     odwroc.setBounds(130, 90, 150, 30); 
     add(odwroc); 
    } 

    public static void main(String[] args) { 
     Main main = new Main(); 
     main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     main.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Object source = e.getSource(); 
     liczba2 = Integer.parseInt(tWykladnik.getText()); 
     liczba1 = Integer.parseInt(tPodstawa.getText()); 
     switch(source){ 
      case poteguj: 
       if(!odwroc.isSelected()) { 
        wynikLiczb = (long) Math.pow(liczba1, liczba2); 
        wynik.setText(liczba1 + " do potegi " + liczba2 + " jest rowne: " + wynikLiczb); 
       } 
       else if(odwroc.isSelected()){ 
        wynikLiczb = (int) Math.pow(liczba2, liczba1); 
        wynik.setText(liczba2 + " do potegi " + liczba1 + " jest rowne: " + wynikLiczb); 
       } 
      } 
     } 
    } 
+0

請將您的代碼添加到問題本身。一個鏈接是不夠的。 –

+0

特別是這個鏈接似乎已經過期了:-( – Mureinik

+0

而且錯誤很明顯 – chrylis

回答

1

問題是poteguj不是一個常數。您只能在恆定值上使用switch。恐怕你被卡住了if

你也許可以把你的源代碼放入List並從中提取一個常數值。

List<JButton> sourceList = new ArrayList<>(); 
// add your sources in a known order 

int sourceIndex = sourceList.indexOf(source); 
switch (sourceIndex) { 
case 0: // poteguj 
    // do something 
    break; 
case 1: // ??? 

但是這犧牲了教條的清晰度。當問題出現時,if-else if並不壞。您的代碼應理想地反映您的問題。

+0

有沒有辦法避免它?如果我添加到程序其他數學運算我會得到很多「如果」 –

+0

正如@resueman已經指出的那樣,JLS在這一點上是堅定的,但即使你可以使用'switch',你最終會遇到很多'case',不是嗎?問題是相同的。 –

+0

所以「如果梯子」在這種情況下不是錯誤?我被教導要避免它 –

1

發生此錯誤的原因是poteguj不是編譯時間常量,這是switch語句所需的。這是the grammar defined in the JLS所要求的。所以沒有辦法做到你想要的switch

幸運的是,它很容易將它轉換成一個if聲明,就像這樣:

if(source == poteguj){ 
    if(!odwroc.isSelected()) { 
     wynikLiczb = (long) Math.pow(liczba1, liczba2); 
     wynik.setText(liczba1 + " do potegi " + liczba2 + " jest rowne: " + wynikLiczb); 
    } 
    else if(odwroc.isSelected()){ 
     wynikLiczb = (int) Math.pow(liczba2, liczba1); 
     wynik.setText(liczba2 + " do potegi " + liczba1 + " jest rowne: " + wynikLiczb); 
    } 
} 

同樣的邏輯,沒有錯誤編譯時。

,你甚至可以用更多的情況下擴大這一點,並保持相同的基本結構如你與有switch

if(source == poteguj){  //case poteguj: 
    // ... 
} else if(source == item2){ //case item2: 
    // ... 
} else if(source == item3){ // case item3: 
    // ... 
} else{}     // default: 

最後要注意的是,如果你有一個非常大的部分是這樣,它可能表示您應該重新考慮您的設計,因此沒有必要。如何做到這一點將嚴重依賴於你的代碼的細節,所以我不知道如何做到這一點的一般性答案。但在這種情況下,switch不會是一個很好的解決辦法。

+0

我知道這一點,但我害怕獲得大量的「如果」,當我添加其他數學運算。那麼我會有比「poteguj」更多的資源。可以避免這種情況嗎? –

+0

@MaciekSienkiewicz對不起,但沒有辦法解決它。即使可以使用變量,也不能在通用對象上「切換」。無論哪種方式,它會有相同的長度。一個'switch'需要一個'case'行和一個'break'用於每種可能性,並且'if'需要'else'。 – resueman

+0

所以「如果梯子」在這種情況下不是一個錯誤?我被教導要避免它 –