Как мне расположить кнопки вертикально в JOptionPane?

Я пытаюсь создать текстовую приключенческую игру, в которой верхняя часть экрана - это JTextArea внутри JScrollPane, которая показывает, что происходит, а нижняя часть - это JOptionPane, где вы нажимаете кнопку, чтобы сделать выбор. По умолчанию кнопки расположены горизонтально. Проблема только в том, что если у меня слишком много кнопок, нет места для новых, и они выталкиваются с экрана. Мне нужно, чтобы они располагались вертикально, потому что они толще, чем высокие. JOptionPane и JScrollPane вложены в gridLayout, который вложен в JFrame. Вот метод, который я использую для создания рамки:

/**
 * Make the frame and everything in it
 */
private void makeFrame()
{
    frame = new JFrame("Adventure!");

    JPanel contentPane = (JPanel)frame.getContentPane();
    contentPane.setBorder(new EmptyBorder(6, 6, 6, 6));
    contentPane.setLayout(new GridLayout(0, 1));

    textArea = new JTextArea(20, 50);       
    textArea.setEditable(false);
    textArea.setLineWrap(true);
    textArea.setFont(new Font("font", Font.BOLD, 15));
    JScrollPane scrollPane = new JScrollPane(textArea);
    contentPane.add(textArea);

    optionPane = new JOptionPane("", JOptionPane.DEFAULT_OPTION, JOptionPane.DEFAULT_OPTION, null, null);
    contentPane.add(optionPane);

    frame.pack();
    // place the frame at the center of the screen and show
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2);
    frame.setVisible(true);
}

person Bom Tomdabil    schedule 22.01.2016    source источник
comment
а внизу - JOptionPane. Почему? Короткий ответ на ваш вопрос - нет. Длинный ответ на ваш вопрос: сделай сам   -  person MadProgrammer    schedule 22.01.2016
comment
Но как применить BoxLayout к кнопкам внутри JOptionPane?   -  person Bom Tomdabil    schedule 23.01.2016
comment
@MadProgrammer: Что бы вы посоветовали мне использовать вместо этого?   -  person Bom Tomdabil    schedule 23.01.2016
comment
@ user1803551: Может, я немного программист-новичок, но я не совсем понимаю, что вы имеете в виду. Нужно ли мне создавать собственный класс, расширяющий JDialog?   -  person Bom Tomdabil    schedule 23.01.2016
comment
Можно, но не обязательно. Просто создайте JDialog и добавьте свою панель к нему. Он ведет себя аналогично JFrame.   -  person user1803551    schedule 23.01.2016
comment
// place the frame at the center of the screen and show Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2); можно заменить на .. // place the frame at the center of the screen and show frame.setLocationRelativeTo(null);   -  person Andrew Thompson    schedule 23.01.2016
comment
Предоставьте ASCII-графику или простой рисунок предполагаемого макета графического интерфейса минимального размера и, если его можно изменить, с большей шириной и высотой.   -  person Andrew Thompson    schedule 23.01.2016
comment
@ user1803551: как настроить панель? Могу ли я изменить его с помощью метода setContentPane? Потому что у меня это не работает.   -  person Bom Tomdabil    schedule 23.01.2016
comment
Спасибо, что указали на это, Эндрю :)   -  person Bom Tomdabil    schedule 23.01.2016
comment
Было бы лучше, если бы я просто использовал JButtons в GridLayout?   -  person Bom Tomdabil    schedule 23.01.2016
comment
См. здесь и ссылку в моем предыдущем комментарии.   -  person user1803551    schedule 23.01.2016
comment
Возможный дубликат Как вы размещаете кнопки вертикально на JOptionPane с JDialogs?   -  person Joshua Goldberg    schedule 25.10.2019


Ответы (1)


Вместо использования JOptionPane используйте JButtons в GridLayout. Вы можете указать, сколько компонентов вы хотите пересечь и опустить при создании следующим образом: new GridLayout(0, 3). Это приведет к тому, что 3 кнопки будут сложены друг на друга, первая int - это сколько вы хотите, а вторая, сколько вы хотите вниз. Попробуй это:

/**
 * Make the frame and everything in it
 */
private void makeFrame()
{
frame = new JFrame("Adventure!");

JPanel contentPane = (JPanel)frame.getContentPane();
contentPane.setBorder(new EmptyBorder(6, 6, 6, 6));
contentPane.setLayout(new GridLayout(0, 1));

textArea = new JTextArea(20, 50);       
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setFont(new Font("font", Font.BOLD, 15));
JScrollPane scrollPane = new JScrollPane(textArea);
contentPane.add(textArea);


//This replaces your JOptionPane block
    buttonPane = new JPanel();
    buttonPane.setLayout(new GridLayout(0, 1));
    contentPane.add(buttonPane);

frame.pack();
// place the frame at the center of the screen and show
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2);
frame.setVisible(true);
}
person Bom Tomdabil    schedule 29.01.2016