2 回答
TA贡献1810条经验 获得超4个赞
不要编写试图猜测要使用的正确值的侦听器。当您向特定组件注册侦听器时,您已经知道它是哪个组件,因此您可以注册一个侦听器,为该组件做正确的事情。
在这种情况下,当成本存储在数组中时,还应该有一个相应的数组用于构建菜单项,它允许构建项和相应的侦听器。
例如
static String[] dorms = { "Allen Hall", "Pike Hall", "Farthing Hall" };
static int[] dormCosts = { 10, 20, 40 };
static String[] meals = { "7 / weak", "14 / week", "unlimited" };
static int[] mealCosts = { 5, 8, 15 };
JTextField totalField = new JTextField();
int dormCost = dormCosts[0];
int mealCost = mealCosts[0];
void updateTotalCosts() {
int totalCost = dormCost + mealCost; // really plus not multiply?
totalField.setText("$" + totalCost);
}
JMenuBar buildMenu() {
final JMenuBar mb = new JMenuBar();
JMenu menu = mb.add(new JMenu("Meals"));
for(int ix = 0; ix < meals.length; ix++) {
int currMealCosts = mealCosts[ix];
menu.add(meals[ix]).addActionListener(ev -> {
mealCost = currMealCosts;
updateTotalCosts();
});
}
menu = mb.add(new JMenu("Dorms"));
for(int ix = 0; ix < dorms.length; ix++) {
int currDormCosts = dormCosts[ix];
menu.add(dorms[ix]).addActionListener(ev -> {
dormCost = currDormCosts;
updateTotalCosts();
});
}
return mb;
}
在每次循环迭代中,我们已经知道我们正在创建哪个项目以及与它相关的成本,因此我们使用这些成本注册一个监听器。
如果您不能使用 lambda 表达式,则构造方法的前 Java 8 变体将如下所示
JMenuBar buildMenu() {
final JMenuBar mb = new JMenuBar();
JMenu menu = mb.add(new JMenu("Meals"));
for(int ix = 0; ix < meals.length; ix++) {
final int currMealCosts = mealCosts[ix];
menu.add(meals[ix]).addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
mealCost = currMealCosts;
updateTotalCosts();
}
});
}
menu = mb.add(new JMenu("Dorms"));
for(int ix = 0; ix < dorms.length; ix++) {
final int currDormCosts = dormCosts[ix];
menu.add(dorms[ix]).addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ev) {
dormCost = currDormCosts;
updateTotalCosts();
}
});
}
return mb;
}
TA贡献1812条经验 获得超5个赞
恐怕这种方法行不通。您无法从 ActionListener 内部访问您的 UI 组件。
您可能想尝试向 JMenuItems 添加匿名侦听器,以更新类的属性以执行计算。
编辑:检查 Holger 的答案以获得一个不错的解决方案:)
通过这种方式,您可以访问外部组件或更好地将其委托给模型类。见这里:https : //www.codejava.net/java-core/the-java-language/java-8-lambda-listener-example
添加回答
举报