[英]Adding an additional custom button to JOptionPane
我正在嘗試顯示一個框架,向用戶顯示一個項目列表,用戶可以從中選擇(從組合框菜單中),用戶現在可以選擇確定以選擇所選項目,或按取消,返回null。 這些是給我的默認選項。
這是我的代碼片段:
Set<ICarOption> optionSet = spec.getCarOptions(category);
// If the category is not mandatory, create a makeshift option object to skip.
if(!category.getMandatory()) optionSet.add(new CarOption("skip"));
ICarOption[] optionArray = optionSet.toArray(new ICarOption[optionSet.size()]);
ICarOption selectedOption = (ICarOption)JOptionPane.showInputDialog(
frame,
"Choose one of the following options for Category " + category + ".\n" +
"If skip is available, you may choose it to skip this category.",
"Select a feature",
JOptionPane.QUESTION_MESSAGE,
null,
optionArray,
optionArray[0]);
此代碼發生在for循環中,迭代類別,其中類別並不總是強制性的。 這意味着如果我想允許用戶選擇跳過某個類別,我會對組合框執行另一個名為skip的選項,如果選擇了該選項,我將相應地跳過它。 但這感覺就像一種骯臟的做事方式(在我定義的ICarOption對象的意義上,跳過根本不是一個選項)而且如果類別是強制性的,我寧願有一個叫做skip的按鈕,它是灰色的(不可點擊)當類別不是強制性時可用。
我在這里看到了一些例子: http : //docs.oracle.com/javase/7/docs/api/javax/swing/JOptionPane.html
它似乎表明我應該用自定義的按鈕列表替換我的組合框,這不是我想要的。 我需要3個按鈕(ok,skip,cancel),以及項目列表。
更新:說明我的GUI將是什么樣子:
這意味着在輸入窗口中我需要看到帶有項目和3個按鈕的組合框。
- 刪除了子問題 -
UPDATE2:我剛才意識到我不能使用JButton,因為我需要在actionListener中執行相當多的操作,並且它要求變量是final,其中一些不是final。
目前我的代碼如下所示:
JPanel panel = new JPanel();
JComboBox<ICarOption> optionsBox = new JComboBox<ICarOption>();
panel.add(optionsBox);
for(ICarOption option : spec.getCarOptions(category)){
optionsBox.addItem(option);
}
Object[] options = { "Select option", "Skip", "Cancel" };
int selected = JOptionPane.showOptionDialog(
panel,
"Choose one of the following options for Category " + category + ".\n" +
"If skip is available, you may choose it to skip this category.",
"Select option",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE, null,
options,
options[0]);
if(selected == JOptionPane.NO_OPTION) continue;
if(selected == JOptionPane.CANCEL_OPTION) throw new UnavailableException();
if(selected == JOptionPane.YES_OPTION){
...
}
靈感來自: Java:showInputDialog中的自定義按鈕
這個問題是我現在沒有辦法控制跳過按鈕,因為它是在創建窗口時創建的。
更新3:它現在有效,但我並不為我的表現感到自豪。
JPanel panel = new JPanel();
JComboBox<ICarOption> optionsBox = new JComboBox<ICarOption>();
panel.add(optionsBox);
for(ICarOption option : spec.getCarOptions(category)){
optionsBox.addItem(option);
}
int selected;
if(!category.getMandatory()){
Object[] options = { "Select option", "Cancel", "Skip" };
selected = JOptionPane.showOptionDialog(
panel,
"Choose one of the following options for Category " + category + ".\n" +
"If skip is available, you may choose it to skip this category.",
"Select option",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE, null,
options,
options[0]);
}
else{
Object[] options = { "Select option", "Cancel" };
selected = JOptionPane.showOptionDialog(
panel,
"Choose one of the following options for Category " + category + ".\n" +
"If skip is available, you may choose it to skip this category.",
"Select option",
JOptionPane.YES_NO_OPTION,
JOptionPane.INFORMATION_MESSAGE, null,
options,
options[0]);
}
// careful! CANCEL_OPTION means skip has been pressed and NO_OPTION means cancel
if(selected == JOptionPane.CANCEL_OPTION) continue;
if(selected == JOptionPane.NO_OPTION) throw new UnavailableException();
if(selected == JOptionPane.YES_OPTION){
...
}
肯定有一大堆重復的代碼,但這是一種工作方式,感覺比將skip作為對象更好。
更新4:將重復部分更改為以下內容:
ArrayList<Object> tempList = new ArrayList<Object>();
int optionType;
tempList.add("Select option");
tempList.add("Cancel");
if(!category.getMandatory()){
tempList.add("Skip");
optionType = JOptionPane.YES_NO_CANCEL_OPTION;
}
else optionType = JOptionPane.YES_NO_OPTION;
Object[] options = tempList.toArray(new Object[tempList.size()]);
int selected = JOptionPane.showOptionDialog(
panel,
"Choose one of the following options for Category " + category + ".\n" +
"If skip is available, you may choose it to skip this category.",
"Select option",
optionType,
JOptionPane.INFORMATION_MESSAGE, null,
options,
options[0]);
所以我將初始化存儲在ArrayList中,然后將其轉換為數組。 這開始看起來對我很好。 :p我不得不說我嚴重低估了這個問題。 我只想更改從添加對象到我的項目列表,以便跳過,跳過按鈕。 那不知何故花了幾個小時做'正確'。
小編輯(請注意用戶3469755):我很抱歉,我只看了一些以前的編輯,有些東西只是打我。 你的原始答案為我提供了我一直想要的東西......使用監聽器的問題是我在OK按鈕中放了很多功能,但它真正需要做的就是分配所選的項目從下拉列表到參數'selectedOption'。 我只需要在showOptionDialog之后添加其余的功能以及處理skip和cancel的部分,因為我確信在那時,已經選擇了一個項目並且參數將保存一個對象。 我有時會非常密集。
您鏈接的文檔非常簡單:
options:將顯示在對話框底部的選項按鈕集的更詳細說明。 options參數的通常值是一個字符串數組。 但參數類型是一個對象數組
因此,您只需要定義一些您選擇的JButton,將它們包裝在一個數組中(如String數組),然后將它們傳遞給JOptionPane.showOptionDialog方法。 對於JButtons的交互性,您可以使用一些Mouseclick偵聽器,例如灰顯並使其不可點擊(不同的東西!)您可以使用setEnabled()更改JButton屬性;
這是我寫的完整示例:
JButton jbt_ok = new JButton("OK");
JButton jbt_skip = new JButton("Skip");
JButton jbt_cancel = new JButton("Cancel");
boolean greyOutSkipButton = true;
jbt_ok.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("OK was clicked");
}
});
jbt_cancel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Cancel was clicked");
}
});
if(greyOutSkipButton)
jbt_skip.setEnabled(false);
else
jbt_skip.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Skip was clicked");
}
});
Object[] options = {jbt_ok, jbt_skip, jbt_cancel};
JOptionPane.showOptionDialog(null, "Click OK to continue", "Warning",
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
主要問題:
我會添加一個單獨的按鈕,如果類別不是必需的,並且對該按鈕添加將跳過該類別並轉到下一個的ActionListener。
Subquestion:
您需要得到用戶的回復。
Object[] options = { "OK", "CANCEL" };
Object answer = JOptionPane.showOptionDialog(null, "Click OK to continue", "Warning",
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
switch ((String) answer){
case "OK":
//do stuff
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.