LayoutManager在不同JFrame中的问题

时间:2012-02-26 20:50:31

标签: java swing jframe layout-manager

我正在尝试创建一个程序,允许您创建自己的自定义表单。在一个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 个答案:

答案 0 :(得分:1)

我看到的一个问题是你试图从GUI类的构造函数中的JTextField获取文本。这是在用户有任何时间输入文本之前所以不应该工作(除非你预先填写它,我没有看到你正在做)。您需要将ActionListeners添加到JTextField或JButton,并在用户输入并按下JButton或在JTextField触发侦听器中按下<Enter>后从JTextField获取文本,而不是在构造函数中。 Oracle Java Swing教程将向您展示如何执行此操作。

修改
关于你的评论:

  

在第一个JFrame中,我有文本字段,用户在其中编写应该在调查中的问题。然后在按下JButton时,它会启动另一个JFrame,打印出那些问题以及JTextfields,供调查人员回答。

这引出了“以何种方式更好?”的问题。

需要考虑的事项包括......

  • 创建一个非GUI问题类来封装什么是问题以及它包含哪些信息。
  • 我创建了一个GUI,目的是创建Question对象,也许将它们放在ArrayList中。
  • 我创建了一个类,用于将问题写入文件,并从文件中读取问题。
  • 然后我会考虑创建用于显示问题的代码。我将此代码用于创建JPanel而不是JFrame。这样我就可以根据需要在JDialog或JFrame或JApplet中显示它。
  • 由于问题与您的代码分开存储,您可以选择以您认为合适的方式显示它们,包括使用报告软件。

答案 1 :(得分:0)

当您有多个JFrames时,很难将所有Swing组件保留在事件派发线程上。 Swing组件不是线程安全的。

正如Hovercraft Full Of Eels在他的回答中所说,Java Swing应用程序只有一个JFrame。在JFrame中,您可以根据需要创建尽可能多的JPanels