2

ここでの私の目的は、必ずしも JTextArea ではなく、Java でコンソールのような動作をするコンポーネントを取得することですが、これは最初に試すのが理にかなっているように思えました。出力は JTextArea が提供するメソッドを使用するだけで十分に単純ですが、入力は別の問題です。入力を傍受し、それに基づいて行動したい-文字ごとに。漠然と関連するものに DocumentListener を使用する例をいくつか見つけましたが、入力した内容を簡単に確認できないようです。これは、それに基づいて行動する方法を決定する必要があるものです。

私はこれについて正しく行っていますか?これにはより良い方法がありますか?

アプリケーション コードの関連部分を囲みます。

public class MyFrame extends JFrame {
    public MyFrame() {
        Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize=new Dimension((int)(screenSize.width/2),(int)(screenSize.height/2));
        int x=(int)(frameSize.width/2);
        int y=(int)(frameSize.height/2);
        setBounds(x,y,frameSize.width,frameSize.height);


        console = new JTextArea("",25,80);
        console.setLineWrap(true);
        console.setFont(new Font("Monospaced",Font.PLAIN,15));
        console.setBackground(Color.BLACK);
        console.setForeground(Color.LIGHT_GRAY);
        console.getDocument().addDocumentListener(new MyDocumentListener());

        this.add(console);

    }

    JTextArea console;

}

class MyDocumentListener implements DocumentListener
{
    public void insertUpdate(DocumentEvent e)
    {
        textChanged("inserted into");
    }
    public void removeUpdate(DocumentEvent e)
    {
        textChanged("removed from");
    }
    public void changedUpdate(DocumentEvent e)
    {
        textChanged("changed");
    }
    public void textChanged(String action)
    {
        System.out.println(action);
    }
}

助けてくれてありがとう。

EDIT1: JTextPane と DocumentFilter を使用してこれを実行しようとしましたが、何かを入力すると、DocumentFilter のメソッドが実行されません。変更したコードを同封します。

public class MyFrame extends JFrame {
    public MyFrame() {
        Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize=new Dimension((int)(screenSize.width/2),(int)(screenSize.height/2));
        int x=(int)(frameSize.width/2);
        int y=(int)(frameSize.height/2);
        setBounds(x,y,frameSize.width,frameSize.height);

        console = new JTextPane();
        //console.setLineWrap(true);
        console.setFont(new Font("Monospaced",Font.PLAIN,15));
        console.setBackground(Color.BLACK);
        console.setForeground(Color.LIGHT_GRAY);
        StyledDocument styledDoc = console.getStyledDocument();
            if (styledDoc instanceof AbstractDocument) {
            doc = (AbstractDocument)styledDoc;
            doc.setDocumentFilter(new DocumentSizeFilter());
        }

        this.add(console);

    }

    JTextPane console;
    AbstractDocument doc;

}

class DocumentSizeFilter extends DocumentFilter {

        public DocumentSizeFilter() {

    }

    public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) throws BadLocationException {
        System.out.println(str);
        if (str.equals("y")) {
            System.out.println("You have pressed y.");
        }
    }

    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)  throws BadLocationException {

    }

}
4

3 に答える 3

1

入力を傍受し、それに基づいて行動したい

次に、おそらく DocumentFilter を使用する必要があります。詳細については、ドキュメント フィルタの実装を参照してください。

于 2010-10-07T23:11:52.570 に答える
0

jar ファイルに署名する、作成したアプリのコンソールとしてテキスト領域を使用しています。JTextArea には append() メソッドがあります。

ジャー署名者

JTextArea console=new JTextArea();
console.append("Insert console text here \n") \\  \n for new line
于 2012-02-08T22:14:01.610 に答える
0

Swing テキスト コンポーネントをカスタマイズするには、さまざまな方法があるようです。あなたと似たようなことをしたとき、カスタムドキュメントで成功しました:

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class CustomDocument extends PlainDocument {
    @Override
    public void insertString(int offset, String string, AttributeSet attributeSet) throws BadLocationException {
        // Parse input - in this case convert everything to upper case
        string = string.toUpperCase();
        super.insertString(offset, string, attributeSet);
    }
}

コードをテストできる主な方法は次のとおりです。

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(100, 100, 300, 300);
    frame.add(new JTextArea(new CustomDocument()));
    frame.setVisible(true);
}
于 2010-10-08T11:19:46.180 に答える