JSpinner在JOptionPane中占用整个宽度

gsi*_*011 1 java swing width joptionpane jspinner

我正在尝试将JSpinner放在JOptionPane中,如下所示,

        SpinnerModel saModel = new SpinnerNumberModel(11, 1, 36, 1);
        JSpinner saSpinner = new JSpinner(saModel);
        Dimension d = saSpinner.getSize();
        d.width = 20;
        saSpinner.setSize(d);

        Object[] message = { "Choose the key number for sa.", saSpinner };

        JOptionPane optionPane = new JOptionPane(message,
                JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
        JDialog dialog = optionPane.createDialog(frame, "Change Sa Key");
        dialog.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

这是有效的,但唯一的问题是,无论我设置的大小如何,JSpinner都会填充Dialog的宽度.我也尝试过使用setPreferredSize().我该如何解决?

Hov*_*els 5

为什么不把它放在JPanel中呢?

  SpinnerModel saModel = new SpinnerNumberModel(11, 1, 36, 1);
  JSpinner saSpinner = new JSpinner(saModel);
  Dimension d = saSpinner.getSize();
  d.width = 20;
  saSpinner.setSize(d);

  // Object[] message = { "Choose the key number for sa.", saSpinner };

  JPanel panel = new JPanel();
  panel.add(new JLabel("Choose the key number for sa:"));
  panel.add(saSpinner);

  JOptionPane optionPane = new JOptionPane(panel,
          JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
  JDialog dialog = optionPane.createDialog(frame, "Change Sa Key");
  dialog.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

虽然我自己,但我不知道我会为此创建一个JDialog,而只是显示JOptionPane.showConfirmDialog(...)方法:

  SpinnerModel saModel = new SpinnerNumberModel(11, 1, 36, 1);
  JSpinner saSpinner = new JSpinner(saModel);
  Dimension d = saSpinner.getSize();
  d.width = 20;
  saSpinner.setSize(d);

  JPanel panel = new JPanel();
  panel.add(new JLabel("Choose the key number for sa:"));
  panel.add(saSpinner);

  int selection = JOptionPane.showConfirmDialog(frame, panel, "Change Sa Key", 
          JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
  if (selection == JOptionPane.OK_OPTION) {
     System.out.println("Sa Key is: " + saModel.getValue().toString());
  }
Run Code Online (Sandbox Code Playgroud)

  • 是的,我甚至在你发布答案之前切换到了showConfirmDialog方法.但是你的JPanel方法效果很好,所以我会尽快接受你的回答:) (2认同)