我想通过带有子菜单的菜单运行,但是当我使用这种级联样式进行子菜单时,“输入”上的操作仅执行序列中的第一个操作,而不执行其余操作。任何帮助表示赞赏。
open.addActionListener(new ActionListener(){
String text;
double amt;
String bal;
double ir;
String name;
String acbal;
public void actionPerformed(ActionEvent e) {
screen.setText("Press s for savings or c for checking");
save.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
screen.setText("Enter name");
//get name
enter.addActionListener(new ActionListener(){
//balance
public void actionPerformed(ActionEvent e) {
text= entering.getText();
name=text;
entering.setText(null);
screen.setText("enter account balance");
//bal
enter.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
bal=entering.getText();
amt = Double.parseDouble(bal);
entering.setText(null);
//interest
screen.setText("enter interest rate");
enter.addActionListener(new ActionListener(){
public void actionPerformed(
ActionEvent e) {
bal=entering.getText();
ir=Double.parseDouble(bal);
entering.setText(null);
screen.setText("enter account number");
enter.addActionListener(new ActionListener(){
public void actionPerformed(
ActionEvent e) {
text=entering.getText();
acbal=text;
entering.setText(null);
screen.setText("Commands : O- Open Account\n"+
" D- Deposit\n"+
" W- Withdraw\n"+
" I- Pay Interest\n"+
" T- Transaction");
}
});
}
});
}
});
}
});
//
SavingAccount sav = new SavingAccount(name,acbal,amt,ir);
banker.add(sav);
}
});//open account action
}
});
答案 0 :(得分:0)
我在这里猜测是因为写这篇文章的时候,你的问题非常不完整,但是说了之后,看起来你想要一个可以从用户那里得到输入的组件集合,但是你希望得到的具体输入是改变,取决于程序的“状态”。因此,例如,当此代码启动时,您希望此组件集合获取名称,然后在完成后,您希望它获得帐户余额,依此类推。
如果是这种情况,那么考虑为为此目的明确创建JPanel的类编写代码,并通过更改提示和执行不同的操作来响应程序的 state 中的更改输入输入。
例如,让我们将您的问题简化为我们希望用户输入姓名,地址和城市信息的问题。所以让我们创建一个枚举来封装这些状态:
enum InputState {
NAME("Name"), ADDRESS("Address"), CITY("City"), DONE("Done");
private String text;
private InputState(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
然后我们可以创建一个包含感兴趣组件的JPanel,并且可以根据需要更改提示和JButton Actions:
class GetInputPanel extends JPanel {
// almost arbitrary numbers below.
// you'll want to change this
private static final int PREF_W = 500;
private static final int PREF_H = 40;
private JLabel promptLabel = new JLabel();
private JTextField inputField = new JTextField(10);
private JButton doActionButton = new JButton();
public GetInputPanel() {
add(promptLabel);
add(inputField);
add(doActionButton);
}
// the most important method
// allow outside objects the ability to change
// our JButton and JTextField's Action
public void setAction(Action action) {
inputField.setAction(action);
doActionButton.setAction(action);
// note that setting a JButton's Action
// will change its text and the action it
// performs on being pressed
}
// allow outside objects the ability to change
// our promptLabel's text
public void setPrompt(String prompt) {
promptLabel.setText(prompt);
}
public String getInputText() {
return inputField.getText();
}
public void clearInputText() {
inputField.setText("");
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
inputField.setEnabled(enabled);
doActionButton.setEnabled(enabled);
}
}
然后我们可以创建自己的Action,根据其状态改变它的作用。它当然有一个State字段state,每次按下JButton时都会改变它(或者在JTextField中按下enter键):
class GetDataAction extends AbstractAction {
private GetInputPanel inputPanel;
private Data data;
private InputState state = InputState.NAME;
public GetDataAction(GetInputPanel inputPanel, Data data) {
super("Get Name");
this.inputPanel = inputPanel;
this.data = data;
}
@Override
public void actionPerformed(ActionEvent evt) {
if (state == InputState.NAME) {
data.setName(inputPanel.getInputText());
state = InputState.ADDRESS;
} else if (state == InputState.ADDRESS) {
data.setAddress(inputPanel.getInputText());
state = InputState.CITY;
} else if (state == InputState.CITY) {
data.setCity(inputPanel.getInputText());
state = InputState.DONE;
System.out.println("Data: " + data);
putValue(NAME, "");
inputPanel.setPrompt("");
inputPanel.setEnabled(false);
}
if (state != InputState.DONE) {
putValue(NAME, "Get " + state.getText());
inputPanel.setPrompt("Please Enter Your " + state.getText());
}
inputPanel.clearInputText();
}
}
一个Data类,用于保存我们正在根据用户输入更改的数据:
class Data {
private String name;
private String address;
private String city;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Data [name=" + name + ", address=" + address + ", city=" + city
+ "]";
}
}
然后是一个GUI类,将它们放在一起并显示所有内容:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class GetSuccessiveInputs {
private static void createAndShowGui() {
Data data = new Data();
GetInputPanel inputPanel = new GetInputPanel();
inputPanel.setPrompt("Please enter your name:");
inputPanel.setAction(new GetDataAction(inputPanel, data));
JFrame frame = new JFrame("GetSuccessiveInputs");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(inputPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}