我正在制作一本Java互动小说,但我的JTextArea已经消失了

时间:2016-06-12 14:30:26

标签: java swing jtextarea adventure

我的冒险游戏有一堆嵌套的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);

         }
    }

}

1 个答案:

答案 0 :(得分: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());
    }
}