2016-06-12 4 views
0

내 어드벤처 게임에 입력 내용을 기반으로 무언가를 출력하는 중첩 된 if 문이 있지만 JTextField는 하나의 입력 만 가져온 다음 사라집니다. JTextField에 무제한 입력을 받아서 .append를 사용하여 jtextarea에 표시하려고합니다. if 문에서 이야기 경로가 끝날 때까지 사용자 입력을 계속 받도록하고 싶습니다. 만약 JTextField로부터 입력을 받아서 JTextArea에 출력을 저장하고 싶다면.자바 인터랙티브 소설을 만들고 있지만 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); 

     } 
    } 

} 
+0

OK를 들어

은, 지금은 혼란 스러워요. 두 번째로 코드를보고 있는데 myPanel이 JOptionPane에 추가 된 것을 볼 수 있습니다. JOptionPane에 표시 될 예정입니까, 아니면 기본 JFrame GUI에 표시되어야합니까? –

+0

JOptionPane에 JTextField에서 입력 한 내용을 표시하고 JTextArea에 텍스트를 표시한다고 가정합니다. –

+0

질문을 편집하고 가능한 정확하게 수행 할 수 있도록 철자를 입력하십시오. myPanel이해야 할 일,보기에 그대로 있어야하고 기본 GUI가되어야하는지, JFrame과 어떻게 관련되는지, 프로그램과 문제를 더 잘 이해하는 데 도움이되는 모든 것. –

답변

3

하기는 myPanel에 추가됩니다 JScdrollPane, scrool에 한 번 myPanel에 한번의 GUI에 두 번 필드를 추가하고 있습니다. 이 작업을 수행하지 말고 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

나는 자바 1.6을 사용하고있어 정적에서 변경할 때마다 오류가 발생합니다. –

+2

@JakeBarcelona : Java의 버전은이 문제가되지 않습니다 (주 메소드에서 수행하는 작업에 문제가 있음). 오류가 발생하면 오류를 거꾸로 수정합니다. 해결책은 필드를 정적으로 만드는 것이 아니라 정적 인 방법으로 필드에 액세스하지 않는 것입니다. 사실 그들은 모두 private 인스턴스 필드 여야하며, 제어 된 public 메소드를 통해서만 mutate하거나 액세스해야합니다. 이것은 기본적인 자바이며 GUI 코딩으로 뛰어 들기 전에 배워야 할 것입니다. –

관련 문제