2

我需要通过 gui 向用户显示一些相关信息(如介绍、是/否问题和其他问题),然后用户将他们的响应输入控制台。但是,我一生都无法想到或找到一种方法来做到这一点。如何运行 GUI 但仍允许输入到控制台?这是我拥有的一些精简代码,显示了我正在尝试做的事情。我正在从处理容器内容的 pps 框架类中执行此操作。我只需要添加按钮、文本字段以及稍后的操作事件。

public class gui extends XFrame
{
    private JTextField[] textFieldsUneditable;

        public gui()
        {
            super();
            textFieldsUneditable = new JTextField[10];
            for(int i=0; i<textFieldsUneditable.length; i++)
            {
                textFieldsUneditable[i] = new JTextField(42);
                textFieldsUneditable[i].setEditable(false);
                add(textFieldsUneditable[i]);
            }

            revalidate();
            repaint();
        }

        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            // code code code
        }

但是我拥有的是其他方法,在用户在控制台中做出响应后,我想运行这些方法,然后使用 GUI 中的 setText 将其输出到这些不可编辑的 JTextField 中。我希望这是有道理的!

4

1 回答 1

0

我会做这样的事情(下面的例子):

  1. 创建 GUI 并保存对要更新的字段的引用
  2. 逐行获取控制台输入,可以使用Scanner.
  3. 找到要更新的字段
  4. 使用线程安全的方式更新它,使用SwingUtilities.invokeAndWaitorinvokeLater
  5. 重复 3 和 4 直到完成。

public static void main(String[] args) throws Exception {

    // create a new frame
    JFrame frame = new JFrame("Test");
    frame.setLayout(new GridLayout(0, 1));

    // create some fields that you can update from the console
    JTextField[] fields = new JTextField[10];
    for (int i = 0; i < fields.length; i++)
        frame.add(fields[i] = new JTextField("" + i)); // add them to the frame

    // show the frame (it will pop up and you can interact with in - spawns a thread)
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);

    // Create a scanner so that you can get some input from the console (the easy way)
    Scanner s = new Scanner(System.in);

    for (int i = 0; i < fields.length; i++) {

        // get the field you want to update
        final JTextField field = fields[i];

        // get the input from the console
        final String line = s.nextLine();

        // update the field (must be done thread-safe, therefore this construct)
        SwingUtilities.invokeAndWait(new Runnable() {
            @Override public void run() { field.setText(line); }
        });
    }
}
于 2012-05-21T11:16:40.090 回答