Проблемы с LayoutManager в разных JFrames - PullRequest
1 голос
/ 27 февраля 2012

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

Я не могу заставить Менеджеры макетов работать правильно, когда у меня есть такой код:

public class WinMaker implements ActionListener, ItemListener {

// Define variables
public JLabel title;
public JButton submit;
public JButton create;
public JTextField question1;
public String q1;
public JTextField question2;
public JTextField question3;
public JTextField question4;
public JTextField question5;
public JTextField answer1;
public JTextField answer2;
public JTextField answer3;
public JTextField answer4;
public JTextField answer5;
public JLabel response1;
public JComboBox questions;
String[] question = { "1", "2", "3", "4", "5" };
JFrame j = new JFrame();
JFrame f = new JFrame();

public WinMaker() {

    title = new JLabel(
            "Select the # of questions in the form and write your questions in the space below:");

    questions = new JComboBox(question);
    questions.setSelectedIndex(4);
    questions.addItemListener(this);

    question1 = new JTextField(30);
    question2 = new JTextField(30);
    question3 = new JTextField(30);
    question4 = new JTextField(30);
    question5 = new JTextField(30);

    answer1 = new JTextField(15);
    answer2 = new JTextField(15);
    answer3 = new JTextField(15);
    answer4 = new JTextField(15);
    answer5 = new JTextField(15);

    create = new JButton("Create");
    create.setFont(new Font("Tahoma", Font.BOLD, 18));
    create.setBackground(Color.red);
    create.addActionListener(this);

    submit = new JButton("Submit"); // create JButton
    submit.addActionListener(this); // add actionlistener to JButton
            // Create layout
    j.setLayout(new GridLayout(8, 1));
    j.getContentPane();
    j.add(title);
    j.add(questions); //JComboBox

    j.add(question1); 

    q1 = question1.getText(); //I'm trying to get the text in the textfield and             
                                 store it in a string so I can print it out on the   
                                 next JFrame
    response1 = new JLabel(q1); 

    j.add(question2); //textfield
    j.add(question3);
    j.add(question4);
    j.add(question5);
    j.add(create); //create button

    j.setSize(300, 300); // dimensions of JFrame
    j.setTitle("WinMaker"); // title of JFrame
    j.setLocationRelativeTo(null);
    j.setResizable(true);
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    j.setVisible(true);


    f.setLayout(new FlowLayout());
    f.getContentPane();

    f.add(response1);  //text from string won't display
    f.add(answer1);

    f.add(question2); 
    f.add(answer2);

    f.add(question3); 
    f.add(answer3);

    f.add(question4); 
    f.add(answer4);

    f.add(question5); 
    f.add(answer5);

    f.setSize(300, 300); // dimensions of JFrame f.setTitle("WinMaker");
    f.setTitle("WinMaker Form"); // title of JFrame
    f.setLocationRelativeTo(null); 
    f.setResizable(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(false);
   }

   public static void main(String[] args) {
    new WinMaker();
   }
 }

Как только я нажимаю кнопку JButton, я хочу запустить еще один JFrame, отображающий те вопросы, которые пользователь задал в первом JFrame.Любой совет?

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Одна проблема, которую я вижу, заключается в том, что вы пытаетесь получить текст из JTextField в конструкторе класса GUI.Это до того, как у пользователя было время для ввода текста, поэтому он не должен работать (если вы предварительно не заполните его, что я не вижу, что вы делаете).Вы захотите добавить ActionListeners к вашему JTextField или JButton и получить текст из JTextField после того, как пользователь ввел его и нажал JButton или нажал <Enter> в слушателе запуска JTextField, а не в конструкторе.В руководствах по Oracle Java Swing вы узнаете, как это сделать.

Редактировать
По поводу вашего комментария:

В первом JFrame у меня есть текстовые поля, гдепользователи пишут вопросы, которые должны быть в опросе.Затем, когда нажимается JButton, запускается другой JFrame, который печатает эти вопросы, а также JTextfields для человека, принимающего участие в опросе, чтобы ответить.

Возникает вопрос: «Чем лучше?».

Рассмотрим следующие вещи: *

  • Создание класса вопросов без графического интерфейса для инкапсуляции только того, что является вопросом, и какую информацию он содержит.
  • Я бы создал графический интерфейс с целью создания объектов Question, возможно, поместив их в ArrayList.
  • Я бы создал класс для записи вопросов в файл и также чтения вопросов изфайла.
  • Тогда я бы подумал о создании кода для отображения вопросов.Я бы направил этот код на создание JPanel, а не JFrame.Таким образом, я могу отображать его в JDialog, или в JFrame или JApplet по желанию.
  • Поскольку Вопросы хранятся отдельно от вашего кода, у вас есть возможность отображать их любым удобным для вас способом, включая использованиепрограммное обеспечение для составления отчетов.
0 голосов
/ 27 февраля 2012

Если у вас есть несколько JFrames, трудно сохранить все компоненты Swing в потоке диспетчеризации событий. Компоненты качания не безопасны для резьбы.

Как сказал Hovercraft Full Of Eels в своем ответе, в приложении Java Swing есть один и только один JFrame. В JFrame вы можете иметь столько JPanels, сколько вам нужно для создания графического интерфейса.

...