有没有办法在模式对话框中创建 JList?

Is there a way to create a JList in a modal dialog?

我有一个 JFrame 已经可见。用户可以加载保存的会话。

想法是创建一个 JList,以便用户可以加载所选会话并更新框架。

下面的代码获取字符串列表并将它们添加到列表中。

DefaultListModel model = new DefaultListModel();
JList list=new JList(model);
JScrollPane pane = new JScrollPane(list);
try {
    for (String  part : Utils.getSessions()) {
        model.addElement(part);
    }
} catch (IOException e1) {
    e1.printStackTrace();
}

下一步:显示步骤。

我发现了什么:将窗格添加到当前框架

我的希望:在模态对话框中显示列表

有没有办法在模态对话框中创建 JList

您可以使用 JOptionPane 的功能来显示任何组件。使用

JOptionPane.showMessageDialog(frame, list);

获取显示您的 JList 的模式对话框。您可以通过添加更多参数来进一步自定义此对话框,有关详细信息,请参阅 here

完整示例:

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

String[] options = new String[] {"a", "b", "c"};
JList<String> list = new JList<>(options);

// Shows the dialog
JOptionPane.showMessageDialog(frame, list);

// Do whatever you want with the selection, for example
frame.add(new JLabel(list.getSelectedValue()));
frame.pack();

事实证明 JOptionPane 已经内置了列表选择,无需使用您自己的 JList

调用方法如下:JOptionPane.showInputDialog

这是一个非常简单的例子:Displaying a dialog with a list of choices

这是一个可以让您选择字体名称的完整示例(使用 Andrew 在评论中提供的便捷字体列表片段)。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class ListChooserDemo extends JFrame {
  JTextPane textPane = new JTextPane();
  String lastChoice = null;

  public ListChooserDemo() {
    setTitle("List Chooser Demo");
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setSize(new Dimension(500, 500));
    add(new JScrollPane(textPane), BorderLayout.CENTER);
    JPanel buttonPanel = new JPanel(new FlowLayout());
    add(buttonPanel, BorderLayout.SOUTH);
    JButton b = new JButton("Choose it!");
    textPane.setText("Click the button...");
    b.addActionListener(this::doChooseFont);
    buttonPanel.add(b);
  }

  public void doChooseFont(ActionEvent e) {
    // a handy way to get a nontrivial list of choices for a demo
    String[] choices = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();

    // Show a list of options with no effort on our part.
    String input = (String) JOptionPane.showInputDialog(
            this,                         // optional reference to frame/window or null
            "Choose a font...",           // prompt displayed over list
            "Font Chooser",               // title
            JOptionPane.QUESTION_MESSAGE, // message style
            null,                         // Use default icon for message style
            choices,                      // array of choices
            lastChoice);                  // initial choice or null
    if (input == null) {
      // Handle case when user canceled, didn't select anything, or hit escape
      textPane.setText(textPane.getText() + "\r\nCanceled!");
    } else {
      // Do stuff that happens when a selection was made
      textPane.setText(textPane.getText() + "\r\nSelected " + input);
      lastChoice = input;
    }
  }

  public static final void main(String[] args) {
    // Run in GUI thread
    SwingUtilities.invokeLater(() -> {
      ListChooserDemo frame = new ListChooserDemo();
      // Center in screen and show
      Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
      frame.setLocation(dim.width / 2 - frame.getSize().width / 2, dim.height / 2 - frame.getSize().height / 2);
      frame.setVisible(true);
    });
  }
}