[Java] javax.swingに挑戦中

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Java] javax.swingに挑戦中

[13:59:24] LiosKの発言: XMLエディタ作りたい><

ということで、swing使ってJavaでがんばってます。Javaは初めてだから全然わからないけど。

とりあえずソースを晒してみる。kerriaというパッケージ名は意味のない開発コード。

スクリーンショット

スクリーンショット

思想

テキストエディタをゼロから作るのは無理なので、サクラエディタから外部ツールとして起動することを前提に作る。サクラエディタはテキスト内容を標準入力に書き込んで、結果を標準出力から読んでくれるから、標準入出力を読み書きするだけの簡単な構造にする。検索とか置換とかはサクラエディタで。

設計

ウィンドウ周りと標準入出力周りはSimpleクラスに全部詰めちゃって、XMLエディタとしての挙動は全部JTextPaneを継承したXmlTextPaneに投げる。

Simple.java

package net.liosk.kerria;

import java.awt.event.*;
import java.io.*;

import javax.swing.*;
import javax.swing.text.JTextComponent;

/**
 * テキストコンポーネントが一つあるだけの単純なウィンドウ
 * 
 * 起動時に標準入力からテキストコンポーネントにテキストを渡し、終了時にテキストコンポーネントからテキストを標準出力に出力する
 */
public class Simple extends JFrame {

    private static final long serialVersionUID = 3867859074974263448L;

    /**
     * デフォルトのテキストコンポーネントを渡してウィンドウを起動する
     */
    public static void main(String[] args) {
        new Simple(new XmlTextPane()).setVisible(true);
    }

    /**
     * テキストコンポーネントオブジェクト
     */
    private JTextComponent editor;

    /**
     * ウィンドウの初期化
     * 
     * @param _editor
     *            テキストコンポーネントオブジェクト
     */
    public Simple(JTextComponent _editor) {
        editor = _editor;

        setSize(640, 480);
        setTitle("Editor");
        setContentPane(new JScrollPane(editor,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));

        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            /**
             * 標準入力を編集エリアに流し込む
             */
            @Override
            public void windowOpened(WindowEvent e) {
                StringBuffer sb = new StringBuffer();
                Reader in = new InputStreamReader(System.in);
                try {
                    while (in.ready()) {
                        sb.append((char) in.read());
                    }
                } catch (IOException exception) {
                    System.err.println(exception.getMessage());
                }

                editor.setText(sb.toString());
            }

            /**
             * 編集エリアの内容を標準出力に流し込む
             */
            @Override
            public void windowClosed(WindowEvent e) {
                System.out.print(editor.getText());
                System.exit(0);
            }
        });
    }

}

XmlTextPane.java

package net.liosk.kerria;

import javax.swing.JTextPane;
import javax.swing.text.StyledDocument;

public class XmlTextPane extends JTextPane {

    private static final long serialVersionUID = -1949491329873327514L;

    public XmlTextPane() {
        StyledDocument doc = getStyledDocument();
        doc.addDocumentListener(new SyntaxHighlighter(this));
        doc.addDocumentListener(new CodeAssistant());
    }

    @Override
    public void setText(String text) {
        super.setText(text.replaceAll("\r\n", "\n"));
    }
}

SyntaxHighlighter.java

package net.liosk.kerria;

import java.awt.Color;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

class SyntaxHighlighter implements DocumentListener, Runnable {

    private MutableAttributeSet plainStyle = new SimpleAttributeSet();
    private MutableAttributeSet tagStyle = new SimpleAttributeSet();

    private JTextPane editor;

    SyntaxHighlighter(JTextPane component) {
        editor = component;
        initializeAttributeSets();
    }

    private void initializeAttributeSets() {
        StyleConstants.setBold(tagStyle, true);
        StyleConstants.setForeground(tagStyle, Color.BLUE);        
    }

    @Override
    public void changedUpdate(DocumentEvent arg0) {
    }

    @Override
    public void insertUpdate(DocumentEvent arg0) {
        SwingUtilities.invokeLater(this);
    }

    @Override
    public void removeUpdate(DocumentEvent arg0) {
        SwingUtilities.invokeLater(this);
    }

    @Override
    public void run() {
        String text = editor.getText();
        StyledDocument doc = editor.getStyledDocument();
        doc.setCharacterAttributes(0, text.length(), plainStyle, true);

        Matcher tag = Pattern.compile("<|>").matcher(text);
        while (tag.find()) {
            doc.setCharacterAttributes(tag.start(), 1, tagStyle, true);
        }
    }

}

CodeAssistant.java

package net.liosk.kerria;

import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

class CodeAssistant implements DocumentListener {

    @Override
    public void changedUpdate(DocumentEvent arg0) {
    }

    @Override
    public void insertUpdate(DocumentEvent arg0) {
    }

    @Override
    public void removeUpdate(DocumentEvent arg0) {
    }

}
スポンサーサイト

関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/84-9d761878

トラックバック

[kerria] Google codeで晒しました
先ほどの記事で、拙いJavaソースを晒していたが、Google codeのSubversionレポジトリを使ってさらに大々的に晒してみた。 kerria - Google Code レポジトリ...
  • 2008-03-02
  • 発信元: 文系大学的IT系の悲哀

コメント

コメントの投稿

お名前
コメント
編集キー
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。