【问题标题】:How to print text to a text area如何将文本打印到文本区域
【发布时间】:2011-11-14 14:32:06
【问题描述】:

我有一个文本区域,我希望在我的游戏中显示消息,我想知道我将如何制作一种将文本打印到文本区域的方法。这是我的 GUI 类:

package com.erikbalen.rpg;
import com.erikbalen.core.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Gui extends JFrame implements ActionListener {

/**
 * 
 */
private static final long serialVersionUID = -384241835772507459L;
private JLabel playerInfo;
private JTextField textField;
private final static String newline = "\n";
private JTextArea textArea;
private JScrollPane scrollPane;

public Gui(Player currentPlayer) {
    super("Erik's RPG");
    setLayout(new FlowLayout());        
    playerInfo = new JLabel(
       "<html>Health = " + currentPlayer.getHealth() 
               + " | " + "Mana = " + currentPlayer.getMana() + "</html>");  
    playerInfo.setBorder(BorderFactory.createTitledBorder(
               currentPlayer.getName()));
    textField = new JTextField(20);
    textField.addActionListener(this);
    textArea = new JTextArea(5, 20);
    scrollPane = new JScrollPane(textArea); 
    textArea.setEditable(false);

    add(playerInfo);
    add(textArea);
    add(textField);
    add(scrollPane);        
}

public void actionPerformed(ActionEvent textBox) {
        String text = textField.getText();
        textArea.append(text + newline);
        textArea.setCaretPosition(textArea.getDocument().getLength());
        textField.selectAll();          
}   
}

所以基本上我想做一个类似的方法:

public void printTextField(String text) {
    //print text to Gui.textArea
}

【问题讨论】:

  • 您确定要同时添加 textArea scrollPane 吗?不如只添加 scrollPane(包含 textArea)?

标签: java swing methods jtextarea


【解决方案1】:

你的意思不是

public void printTextField(String text) {
    textArea.setText(text);
}

?

【讨论】:

  • 否则有一个 textAreaAppendText(String text) 方法将文本和“\n”附加到 textArea。 1+
  • 另外,当必须确保在事件调度线程或 EDT 上调用此方法时,棘手的部分就来了。
【解决方案2】:

好的,您可以为此创建一个 OutputStream。 jTextArea 然后将在您的 GUI 中打印出任何 System.out.print() 或错误...

为此,您将其添加到创建 gui 组件的位置。

然后你在下面添加例如:

PrintStream outStream = new PrintStream( new TextAreaOutputStream(jTextArea1));
        jTextArea1.setFont(new Font(Font.MONOSPACED, Font.BOLD, 12));

        System.setOut( outStream );
        System.setErr( outStream );

然后,您需要在代码中扩展 OutputStream 的内部类, (这里我仍然在为我初始化的名为“jTextArea1”的 jTextArea 做这件事)

public class TextAreaOutputStream extends OutputStream {
        private javax.swing.JTextArea jTextArea1;

        /**
         * Creates a new instance of TextAreaOutputStream which writes
         * to the specified instance of javax.swing.JTextArea control.
         *
         * @param textArea   A reference to the javax.swing.JTextArea
         *                  control to which the output must be redirected to.
         */
        public TextAreaOutputStream( JTextArea textArea ) {
            this.jTextArea1 = textArea;
        }

        public void write( int b ) throws IOException {
            jTextArea1.append( String.valueOf( ( char )b ) );
            jTextArea1.setCaretPosition(jTextArea1.getDocument().getLength());
        }

        public void write(char[] cbuf, int off, int len) throws IOException {
            jTextArea1.append(new String(cbuf, off, len));
            jTextArea1.setCaretPosition(jTextArea1.getDocument().getLength());
        }
    }

这样,所有 System.out 都被重定向到那里,它会保留你提供给它的所有数据,所以你不需要最后一个方法。

而 jTextArea1 对你来说只是 jTextArea...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-23
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多