簡體   English   中英

向JOptionPane添加其他自定義按鈕

[英]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將是什么樣子:

  1. 框架制作完成。
  2. 在對話框窗口中,您會看到ICarOption對象的組合框(下拉列表)
  3. 窗口上還有3個按鈕:OK,SKIP和CANCEL
  4. 如果該類別是強制性的,則SKIP將顯示為灰色。
  5. 如果選擇“確定”,組合框中當前選定的項目將被賦予selectedOption變量
  6. 如果選擇了CANCEL,則選擇選項== null
  7. 如果選擇了SKIP,則將跳過此類別(繼續;)

這意味着在輸入窗口中我需要看到帶有項目和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM