Компоненты Java Swing не отображаются

Помоги мне! Всякий раз, когда я пытаюсь запустить приведенный ниже код, он показывает только кнопку внизу и поле пароля везде. Я хочу видеть все, но не могу

public void setup(){
    frame = new JFrame("Votinator 3000");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    voteconfirm = new JLabel("");
    textarea = new JTextField(1);
    submit = new JButton("Submit Vote!");
    chooser = new JList(items);
    password = new JPasswordField(1);
    password.setVisible(true);
    choices = new JComboBox();
    choices.addItem("Choose");
    choices.addItem("Submit Own");
    type = new JPanel();
    type.add(textarea);
    choices.setEditable(false);
    choices.setSelectedIndex(0);
    frame.setBounds(300, 300, 400, 400);
    frame.getContentPane().add(type);
    frame.getContentPane().add(choices);
    frame.getContentPane().add(voteconfirm);
    frame.getContentPane().add(chooser);
    frame.getContentPane().add(textarea);
    frame.getContentPane().add(password,BorderLayout.CENTER);
    frame.getContentPane().add(submit,BorderLayout.SOUTH);
    frame.setVisible(true);
}

person Barakados    schedule 24.10.2012    source источник


Ответы (4)


Этот

frame.getContentPane().add(password,BorderLayout.CENTER);

Заменит все, что вы добавили на свой экран...

Это добавит кнопку в нижнюю часть экрана...

frame.getContentPane().add(submit,BorderLayout.SOUTH);

Вы можете изменить макет на FlowLayout, который будет отображать все...

введите здесь описание изображения

frame.setLayout(new FlowLayout());
frame.setBounds(300, 300, 400, 400);
frame.getContentPane().add(type);
frame.getContentPane().add(choices);
frame.getContentPane().add(voteconfirm);
frame.getContentPane().add(chooser);
frame.getContentPane().add(textarea);
frame.getContentPane().add(password);
frame.getContentPane().add(submit);

Но я вряд ли думаю, что это то, чего ты действительно хочешь.

Прочитайте

И посмотрите, сможете ли вы найти один или несколько макетов, соответствующих вашим требованиям.

person MadProgrammer    schedule 24.10.2012

BorderLayout — макет по умолчанию для JFrame. Все компоненты в вашем коде добавляются в BorderLayout.CENTER, когда в методе add() нет аргументов. Таким образом, в BorderLayout.CENTER появляется только password, поскольку он заменяет другие компоненты. Попробуйте создать панель, заполнить ее элементами управления и добавить эту панель во фрейм, т.е.:

JPanel content = new JPanel();
content.add(type);
content.add(choices);
content.add(voteconfirm);
content.add(chooser);
content.add(textarea);
content.add(password);
content.add(submit);
frame.getContentPane().add(content);

Вот как это выглядит:

введите здесь описание изображения

РЕДАКТИРОВАТЬ:

Из спецификации BorderLayout:

Для удобства BorderLayout интерпретирует отсутствие спецификации строки так же, как и константу CENTER:

Panel p2 = new Panel();
p2.setLayout(new BorderLayout());
p2.add(new TextArea());  // Same as p.add(new TextArea(), BorderLayout.CENTER);
person tenorsax    schedule 24.10.2012

Это быстрое решение:

public void setup(){
frame = new JFrame("Votinator 3000");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
voteconfirm = new JLabel("");
textarea = new JTextField(1);
submit = new JButton("Submit Vote!");
chooser = new JList(items);
password = new JPasswordField(1);
password.setVisible(true);
choices = new JComboBox();
choices.addItem("Choose");
choices.addItem("Submit Own");
type = new JPanel();
type.add(textarea);
choices.setEditable(false);
choices.setSelectedIndex(0);
frame.setBounds(300, 300, 400, 400);

JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
frame.setContentPane(p);

frame.getContentPane().add(type);
frame.getContentPane().add(choices);
frame.getContentPane().add(voteconfirm);
frame.getContentPane().add(chooser);
frame.getContentPane().add(textarea);
frame.getContentPane().add(password);
frame.getContentPane().add(submit);
frame.setVisible(true);
}

Однако вам нужно больше узнать о LayoutManagers. Посмотрите здесь: http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

Также проверьте miglayout.net

person Community    schedule 24.10.2012

Вам нужно добавить все элементы в тип JPanel, а затем добавить компонент JPanel в JFrame; вот пример

  
        frame = new JFrame("Votinator 3000");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        voteconfirm = new JLabel("");
        textarea = new JTextField(1);
        submit = new JButton("Submit Vote!");
        chooser = new JList(items);
        password = new JPasswordField(1);
        password.setVisible(true);
        choices = new JComboBox();
        choices.addItem("Choose");
        choices.addItem("Submit Own");
        type = new JPanel();
        type.add(textarea);
        choices.setEditable(false);
        choices.setSelectedIndex(0);
        frame.setBounds(300, 300, 400, 400);
        frame.add(type);
        type.add(choices);
        type.add(voteconfirm);
        type.add(chooser);
        type.add(textarea);
        type.add(password);
        type.add(submit);
        frame.setVisible(true);
  


Это должно просто работать.

person Kneel-Before-ZOD    schedule 24.10.2012
comment
Вы можете добавить, что JPanel по умолчанию использует FlowLayout. Если OP хочет использовать другой макет на панели type, он может просто вызвать type.setLayout(), чтобы изменить его. - person Code-Apprentice; 25.10.2012