如何在 JOptionPane 选项对话框中使用 JSlider(或其他 JComponent)?

How can I use a JSlider (or other JComponent) in a JOptionPane option dialog?

我有一个 UI,我想在其中显示一个带有滑动条和一条消息的弹出窗口,并让用户能够在选择(或不选择)一个值后单击“确定”或“取消”。 JOptionPane 有各种看起来很有用的显示方法,但我找不到太多关于让它们做我想做的事情。

这实际上是一个我不得不四处寻找答案的问题,我将在下面提供。我希望它对其他人有用。

我能够找到的示例具有示例的标准缺陷:它们与我想要告诉我如何执行此操作的内容不够接近,并且没有充分解释事物如何改变它们靠我自己。我终于 运行 浏览了一个教程,该教程解释了对话框中的 "messages" 可以是组件,并且 JOptionPane 代码将呈现它们。此示例使用 JSlider,我假设也可以使用其他 JComponents。

文档还讨论了如果您想 "display the dialog directly" 可以做什么,但我从来没有弄清楚他们的意思。

在弄清楚以下内容之前,我偶然发现了各种形式的 JOptionPane 方法:

/**
 * display the dialog for entering the number of spots to move the first
 * marble chosen after a 7 is played. Returns 0 if the user cancelled this
 * operation.
 */
@Override
public int getMoveCount()
{
    int moveCount = 0;

    JSlider slider = createSlider();
    JPanel sliderPanel = createSliderPanel("myMessage", slider);
    String title = "myTitle"; 
    int dialogResponse = JOptionPane.showOptionDialog
            (this,                  // I'm within a JFrame here
             sliderPanel,
             title,
             JOptionPane.OK_CANCEL_OPTION,
             JOptionPane.QUESTION_MESSAGE,
             null, null, null
            );
    if (JOptionPane.OK_OPTION == dialogResponse) 
         { moveCount = slider.getValue(); }
    else { moveCount = 0; } // works for cancel button, red 'x', and keyboard escape key

    return moveCount;
}

private JSlider createSlider()
{
    JSlider slider = new JSlider(1,7);
    slider.setMajorTickSpacing(1);
    slider.setPaintTicks(true);
    slider.setPaintLabels(true);
    slider.setValue(7);                // default to 7

    return slider;
}