2 回答
TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
不要編寫試圖猜測要使用的正確值的偵聽器。當(dāng)您向特定組件注冊(cè)偵聽器時(shí),您已經(jīng)知道它是哪個(gè)組件,因此您可以注冊(cè)一個(gè)偵聽器,為該組件做正確的事情。
在這種情況下,當(dāng)成本存儲(chǔ)在數(shù)組中時(shí),還應(yīng)該有一個(gè)相應(yīng)的數(shù)組用于構(gòu)建菜單項(xiàng),它允許構(gòu)建項(xiàng)和相應(yīng)的偵聽器。
例如
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;
}
在每次循環(huán)迭代中,我們已經(jīng)知道我們正在創(chuàng)建哪個(gè)項(xiàng)目以及與它相關(guān)的成本,因此我們使用這些成本注冊(cè)一個(gè)監(jiān)聽器。
如果您不能使用 lambda 表達(dá)式,則構(gòu)造方法的前 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貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
恐怕這種方法行不通。您無法從 ActionListener 內(nèi)部訪問您的 UI 組件。
您可能想嘗試向 JMenuItems 添加匿名偵聽器,以更新類的屬性以執(zhí)行計(jì)算。
編輯:檢查 Holger 的答案以獲得一個(gè)不錯(cuò)的解決方案:)
通過這種方式,您可以訪問外部組件或更好地將其委托給模型類。見這里:https : //www.codejava.net/java-core/the-java-language/java-8-lambda-listener-example
添加回答
舉報(bào)
