JTextArea как консоль
Я разместил две части кода ниже. Оба кода работают отлично индивидуально. Теперь, когда я запускаю файл Easy и нажимаю кнопку "Пуск", я хочу, чтобы был реализован класс AddNumber. Я хочу сказать, что вместо AddNumber, запущенного на консоли, есть ли способ заставить AddNumber работать в JTextArea, который я создал в первом классе, после нажатия кнопки "Пуск"? Я подумал, может быть, слушатель действия?(Как мы делаем в случае кнопок) Но я не уверен. Есть ли другой способ заставить мою JTextArea выступать в качестве консоли для других файлов.java?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Easy extends JFrame{
JTextArea text=new JTextArea();
JPanel panel=new JPanel(new GridLayout(2,2));
JButton button1 =new JButton("Start");
public Easy(){
panel.add(text);
panel.add(button1);
add(panel,BorderLayout.CENTER);
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae){
//add code to call the other class and make the JTextArea act as a console
}
});
}
public static void main(String arg[]){
Easy frame=new Easy();
frame.setSize(300,100);
frame.setVisible(true);
}
}
Второй класс:
import java.util.Scanner;
class AddNumber
{
public static void main(String args[])
{
int x, y, z;
System.out.println("Enter two numbers to be added ");
Scanner in = new Scanner(System.in);
x = in.nextInt();
y = in.nextInt();
z = x + y;
System.out.println("Sum of entered numbers = "+z);
}
}
Я видел несколько постов, говорящих о PrintStream.. но я не думаю, что это применимо здесь. Пожалуйста, помогите мне. Спасибо:)
ОБНОВЛЕНИЕ: хорошо, я нашел эту ссылку: http://www.codeproject.com/Articles/328417/Java-Console-apps-made-easy, и она работает в том смысле, что она показывает "Введите два числа, которые будут добавлены"... но где пользователь может предоставить свои данные?
РЕДАКТИРОВАТЬ: я просто должен был сделать ссылку на консоль в основном методе моего класса... и он работает... ну, не совсем так, как я хотел бы... но частично... ввод по-прежнему должен перейти от терминала IDE..
1 ответ
Если вы выполните поиск в Google по запросу: "stdout JTextArea", вы получите несколько ссылок для решения вашей проблемы.
- http://www.coderanch.com/t/458147/GUI/java/Redirect-output-stderr-stdout-JTextArea
- Перенаправление System.out в JTextPane
- http://www.jcreator.com/forums/index.php?showtopic=773
В последней ссылке, buddybob расширяется java.io.OutputStream
распечатать стандартный вывод на его JTextArea. Я включил его решение ниже.
TextAreaOutputStream.java
/*
*
* @(#) TextAreaOutputStream.java
*
*/
import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JTextArea;
/**
* An output stream that writes its output to a javax.swing.JTextArea
* control.
*
* @author Ranganath Kini
* @see javax.swing.JTextArea
*/
public class TextAreaOutputStream extends OutputStream {
private JTextArea textControl;
/**
* Creates a new instance of TextAreaOutputStream which writes
* to the specified instance of javax.swing.JTextArea control.
*
* @param control A reference to the javax.swing.JTextArea
* control to which the output must be redirected
* to.
*/
public TextAreaOutputStream( JTextArea control ) {
textControl = control;
}
/**
* Writes the specified byte as a character to the
* javax.swing.JTextArea.
*
* @param b The byte to be written as character to the
* JTextArea.
*/
public void write( int b ) throws IOException {
// append the data as characters to the JTextArea control
textControl.append( String.valueOf( ( char )b ) );
}
}
TextAreaOutputStream
расширяетjava.io.OutputStream
класс и переопределяет егоwrite(int)
перегрузка метода, этот класс использует ссылку наjavax.swing.JTextArea
управляет экземпляром, а затем добавляет к нему вывод всякий раз, когда вызывается его метод write( int b).Чтобы использовать
TextAreaOutputStream
класс, вы должны использовать:
использование
// Create an instance of javax.swing.JTextArea control
JTextArea txtConsole = new JTextArea();
// Now create a new TextAreaOutputStream to write to our JTextArea control and wrap a
// PrintStream around it to support the println/printf methods.
PrintStream out = new PrintStream( new TextAreaOutputStream( txtConsole ) );
// redirect standard output stream to the TextAreaOutputStream
System.setOut( out );
// redirect standard error stream to the TextAreaOutputStream
System.setErr( out );
// now test the mechanism
System.out.println( "Hello World" );