2016-08-11 37 views
0

파일에 텍스트를 쓰는 간단한 응용 프로그램을 Swing에서 작성했습니다. 여기자바 스윙 버튼이 프로그램을 고정시킵니다.

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class WritingTextToFileApp { 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      JFrame frame = new MainFrame("Application"); 

      frame.setSize(500, 400); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
      } 
     }); 

    } 
} 

다른 클래스입니다 : 여기 내 주요 클래스입니다

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.Scanner; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 

public class MainFrame extends JFrame { 

public MainFrame(String title) { 
    super(title); 
    //Set Layout Manager 
    setLayout(new BorderLayout()); 
    //Create Swing Components 
    JTextArea textArea = new JTextArea(); 
    JButton button = new JButton("Add"); 
    button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      Scanner scanner = new Scanner(System.in); 
      String input = scanner.nextLine(); 
      File file = new File("C:\\Users\\Vincent Wen\\Desktop\\Test.txt"); 
      try (BufferedWriter br = new BufferedWriter(new FileWriter(file))) { 
       br.write(input); 
       br.newLine(); 
      } catch (IOException ex) { 
       System.out.println("Unable to write to file:" + file.toString()); 
      } 
     } 

    }); 
    //Add Swing components to conent pane 
    Container c = getContentPane(); 
    c.add(textArea, BorderLayout.CENTER); 
    c.add(button, BorderLayout.SOUTH); 
} 

} I 버튼을 누를 때마다

, 프로그램 정지와 아무 반응이 없습니다. 코드에 문제가 있습니까? 나는 스윙을 처음 사용하므로 어떤 도움을 주시면 감사하겠습니다.

+0

GUI를 관리하는 스레드를 차단하고 사용자가 입력을 읽는 (콘솔) 것을 기다리고 있습니다. 대신 [입력 대화 상자] (https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html#input)를 사용해야합니다. 그러면 정보를 입력 할 창이 열리 며 GUI가 고정되지 않습니다. – resueman

+0

'String input = scanner.nextLine();'은 작업을 차단하고 EDT (Swing GUI를 처리하는 이벤트 디스패처 스레드)에서 실행됩니다. 그래서'scanner'가'System.in'에서 읽을 것이기 때문에 GUI 스레드는 System.in (보통 콘솔입니다)을 통해 데이터를 제공 할 때까지 기다릴 것입니다. – Pshemo

+0

TextArea에서 텍스트를 가져 오거나 사람이 콘솔에 입력하여 'Test.txt'에 쓰려고합니까? TextArea에서 텍스트를 가져 오려면'textArea.getText()'를 실행 한 다음 해당 텍스트에서 파일에 쓰십시오. 이것을'String lines [] = textArea.getText(). split ("\\ n");와 같이 분할하고 선을 가로 질러 건너 뜁니다. – Dominic

답변

2

스윙은 GUI 입력 및 렌더링을 처리하는 동일한 스레드에서 동 기적으로 동작을 실행합니다. 즉, 버튼을 클릭하면 액션 리스너가 실행을 완료 할 때까지 기다렸다가 입력 핸들링과 GUI 그리기로 돌아갑니다. 이 경우 콘솔에 무언가를 입력 할 때까지 GUI 실행이 중지됩니다.

SwingWorker을 사용하여 비동기 적으로 실행할 수 있으므로 작업을 실행하는 동안 GUI가 계속 실행됩니다.

0

문제는 버튼을 누르면 Java가 System.ini (콘솔)에서 데이터를 읽어야한다는 것입니다.

콘솔에서 java 명령을 사용하여 응용 프로그램을 시작하십시오. 그런 다음 버튼을 누른 후 enter를 눌러 콘솔에 텍스트를 입력하십시오. 당신이 일하는 당신의 프로그램.

0

scanner를 사용하는 대신 textArea.getText()를 사용하여 문제를 해결했습니다.