2016-06-12 2 views
0

В моей приключенческой игре есть куча вложенных операторов if для вывода чего-либо на основе ввода, но мой JTextField получает только один вход и затем исчезает. Я хочу, чтобы JTextField принимал неограниченные входные данные и использовал .append, чтобы показать их в jtextarea. Я хочу, чтобы программа продолжала вводить пользовательские входы до тех пор, пока не закончится путь истории в операторах if. Если хотите получить входные данные от JTextField и поместить вывод в JTextArea и сохранить его там.Я создаю интерактивный роман Java, но мой JTextArea Disappears

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); 

     } 
    } 

} 
+0

ОК, теперь я запутался. Я просматриваю ваш код во второй раз, и я вижу, что myPanel добавлен в JOptionPane. Предполагается ли он отображаться в JOptionPane или он должен отображаться в главном графическом интерфейсе JFrame? –

+0

Он должен отображаться в JOptionPane, я получаю входной сигнал от JTextField и отображаю текст в JTextArea. –

+0

. Измените свой вопрос и четко изложите, насколько это возможно, именно то, что вы пытаетесь сделать. То, что должен сделать myPanel, должно ли оно оставаться в поле зрения и быть основным графическим интерфейсом, как оно относится к JFrame, что-нибудь, что поможет нам лучше понять вашу программу и вашу проблему. –

ответ

3

Вы добавляете поля дважды в GUI, один раз MyPanel и один раз в JScdrollPane, приборах типа СПИРАЛЬНЫЙ, который затем добавляют к 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()); 
    } 
} 
+0

Я получаю ошибки каждый раз, когда я меняю их из статического, также использую java 1.6. –

+2

@JakeBarcelona: версия Java для этого не имеет значения (хотя это имеет значение для того, что я делаю в основном методе). Если вы получаете ошибки, то исправляете ошибки назад. Решение состоит не в том, чтобы создавать статические поля, а для того, чтобы они не обращались к ним статическим способом. На самом деле все они должны быть частным экземпляром, и вы должны мутировать или обращаться к ним только через контролируемые публичные методы. Это базовая Java и что-то, чему вы должны учиться, прежде чем перейти к графическому интерфейсу. –