我只是想通过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 :(得分: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
也不错。您的代码应该理想地反映您的问题。
答案 1 :(得分: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
无论如何都不是一个好的解决方案。