0

我的冒险游戏有一堆嵌套的 if 语句来根据输入输出一些东西,但我的 JTextField 只得到一个输入然后消失。我想让 JTextField 接受无限制的输入并使用 .append 在 jtextarea 中显示它们。我想让程序继续接受用户输入,直到 if 语句中的故事路径结束。如果想从 JTextField 获取输入并将输出放在 JTextArea 中并保留在那里。

import java.awt.Dimension;
import java.awt.Font;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.util.Scanner;
import java.io.Reader; 

import javax.swing.*;
import javax.swing.text.BadLocationException;

    /*JakeBarcelona
    *Date:May 5, 2016
    *Program Name:StoryTester.java
    *Description: 
    */



public class StoryTester extends JFrame
{
    static JTextField input = new JTextField(30);
    static JTextArea fields = new JTextArea(30,50);
    static Story ARoom=new Story();


    public static void main(String[] args) throws BadLocationException
    {
        JFrame frame = new JFrame();

        String story=new String();
        JLabel intro = new JLabel(story); 
        //Sets the JLabels font and color


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//puts a red x to close it
        Story wow = new Story();
        String introduction=wow.intro();
        //creates array field for text editing
        fields.insert(introduction, 0);

        String name= fields.getText(0,30);




        //creates new Panel
        JPanel myPanel=new JPanel();


        //creates label for text box
        myPanel.setPreferredSize(new Dimension(600,600));
        myPanel.add(fields);
        myPanel.add(input);

        //puts a scroll bar and cancel and ok button
        JScrollPane scroll = new JScrollPane(fields, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        myPanel.add(scroll);
        int result = JOptionPane.showConfirmDialog(null, myPanel, "Story", JOptionPane.OK_CANCEL_OPTION);

        if(result==JOptionPane.OK_OPTION);
        {

         String jake = input.getText();

         String need = ARoom.storyStatements(jake);
         System.out.println(need);
         fields.append(need);

         }
    }

}
4

1 回答 1

3

您将两次添加到 GUI 中,一次添加到 myPanel,一次添加到 JScdrollPane,scrool,然后添加到 myPanel。不要这样做,而是仅将其添加到 JScrollPane。您还人为地限制了 myPanel JPanel 的大小,这很可能是让您遇到麻烦的原因。

而是以智能方式使用布局,例如给 myPanel 一个 BorderLayout,将 JScrollPane 添加到 BorderLayout.CENTER 位置,并将输入 JTextField 添加到 BorderLayout.PAGE_END 位置。并且不要设置 myPanel 的首选大小,而是让文本组件的列和行属性设置它们的首选大小,这反过来又会设置 myPanel JPanel 的首选大小。

此外,您不恰当地使用静态字段,实际上您当前的字段都不应该是静态的。

例如

import java.awt.BorderLayout;

import javax.swing.*;

public class LayoutEg extends JPanel {
    private static final int COLS = 50;
    private static final int ROWS = 30;
    private JTextField input = new JTextField(COLS);
    private JTextArea fields = new JTextArea(ROWS, COLS);

    public LayoutEg() {
        // two methods below so that words wrap
        fields.setWrapStyleWord(true);
        fields.setLineWrap(true);
        fields.setFocusable(false); // so we can't write directly into JTextArea
        JScrollPane scrollPane = new JScrollPane(fields);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
        setLayout(new BorderLayout(2, 2));
        add(scrollPane, BorderLayout.CENTER);
        add(input, BorderLayout.PAGE_END);
    }

    private static void createAndShowGui() {
        LayoutEg mainPanel = new LayoutEg();

        JFrame frame = new JFrame("Story GUI");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}
于 2016-06-12T14:40:17.847 回答