これはこのシリーズの 2 番目の記事です。前回の記事では、xml とツリー構造が XML の表示に適している理由、XML データの処理方法、JTree Swing コンポーネントの使用方法、再利用可能な XML ドキュメントの作成方法と Jtree コンポーネントでのデータ表示方法について簡単に説明しました。
この記事では、この目的を達成するために、多くの Swing コンポーネント (jsplitPane、JscrollPane、Jbutton、JtextArea コンポーネントを含む) を使用します。
1. 問題の提起と解決
テキストを参照したりビューを参照したりできる XML テキスト エディターを作成するにはどうすればよいですか? Jbutton と JsplitPane を含む Jframe オブジェクトを作成し、JsplitPane オブジェクトに 2 つの JscrollPane オブジェクトを含めます。1 つはグラフィックの閲覧用 (xTree クラス) で、もう 1 つはテキストの閲覧用 (JtextArea クラス) です。 Jbutton は、グラフィカル ブラウジングの更新操作を管理するために使用されます。
2. Xtreeクラスの機能強化
前回の記事では、Jtreeクラスを継承し、XMLデータをグラフィカルツリー形式で表示できる再利用可能なコンポーネントであるXtreeクラスを開発しました。次に、コマンド ラインで XML ファイルが指定されない場合に表示するデフォルトの XML ツリーを提供することで、そのクラスを拡張します。さらに、プログラムがクラッシュしないように、いくつかのエラー処理ロジックも追加します。無効な XML です。
最初のステップは、buildTree()というメソッドを作成することです:
private DefaultTreeModel buildTree(String text)
{
DefaultMutableTreeNodetreeNode;
Node newNode;
// DOMルートノードを取得して変換します。ツリーモデル
newNode = parseXml( text );
else
return null;
} file://end buildTree()
このメソッドは、受信した XML 文字列を取得し、XML 文字列を分析し、DefaultTreeModel 変数インスタンスを構築しますこれを使用して、データからグラフィカルなツリー構造を構築できます。この機能はもともと XTree() コンストラクターに含まれていましたが、デフォルトのグラフィックス ツリーを柔軟に作成できるように、それを取り出して別のメソッドに組み込みました。それが私たちが次にやりたいことです。
次のステップは、buildWelcomeTree() というメソッドを作成することです。このメソッドは、既存の XML リテラル文字列を解析するのではなく、DefaultTreeModel 変数を一度に 1 つずつ構築します。 XML ファイルを指定せずにこのアプリケーションを起動すると、DefaultTreeModel が表示されます。コード スニペット 1 を参照してください
コード スニペット 1:
private DefaultTreeModel buildWelcomeTree()
{
DefaultMutableTreeNode root;
DefaultMutableTreeNode instrUCtions,openingDoc,
EditingDoc,savingDoc;
DefaultMutableTreeNodeopeningDocText,editing DocText,
savingDocText;
DefaultMutableTreeNodeの開発、addingFunctions、
contactingKyle;
root = new DefaultMutableTreeNode( "XML View 1.0 へようこそ" );
instructions = new DefaultMutableTreeNode( "手順" );
openingDoc = new DefaultMutableTreeNode
( "XML ドキュメントを開く" );
openingDocText = newテーブルツリーノード
( "コマンドラインから XmlEditor を呼び出すときは、ファイル名を指定する必要があります。" );
editingDoc = new DefaultMutableTreeNode
右手で "更新" ボタンを押すと、左側のフレームで JTree が再構築されます。" ); SavingDoc = new DefaultMutableTreeNode
SavingDocText = new DefaultMutableTreeNode
( "XmlEditor のこの反復では、
ドキュメントを保存する機能が提供されません。 .add(編集DocText);
新しい DefaultTreeModel( root );
}
を返す次に、デフォルトの表示機能を簡素化するために新しいコンストラクターを追加する必要があります。パラメーターを受け入れられないようにメイン コンストラクターを変更し、単一の XML テキスト文字列を受け入れる新しいコンストラクターを作成します。このようにして、XML テキストが表示されない場合はデフォルトの XTree オブジェクトが作成され、XML テキストが表示される場合は一意の XTree オブジェクトが作成されます。コードフラグメント 2 には 2 つのコンストラクターが示されています。
コードスニペット 2:
public setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION );
setShowsRootHandles( true );
setEditable( false );
dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating( false ) ;
db = dbf .newDocument Builder();
setModel( buildWelcomeTree () );
}
3. XmlEditor クラスを作成します
XmlEditor クラスの目的は、前の記事の XTreeTester クラスと同じです。違いは、XmlEditor に JTextArea が含まれていることです。を使用すると、XML のテキスト バージョンを操作できます。その後、「更新」ボタンをクリックすると、XTree コンポーネントに反映された変更を確認できます。
最初の記事のコードを直接変更すると、XTreeTester.java ファイルの名前を XmlEditor.java に変更し (ただし、コンストラクターを変更する必要があります)、それをテンプレート ファイルとして使用できます。
最初に行うことは、別の JScrollPane、JSplitPane、JTextArea、および JButton の Swing コンポーネントを追加することです。まず、これらすべてのコンポーネントとその他のコンポーネントを宣言します (コード スニペット 3 を参照)。
コードスニペット 3:
privateこのボタンは、この XTree コンポーネントが現在の XML テキストで更新されることを示すために使用されます。また、ActionListener を使用して登録する必要があります。 (コード スニペット 4 を参照) ボタン イベントをインターセプトするには、このクラスを用意して ActionListener を実装する必要があります。また、actionPerformed() メソッドを作成する必要もあります (コード スニペット 5 を参照)。
コードセグメント4:
refreshButton = new JButton( "Refresh" );
refreshButton.setBorder(
BorderFactory.createRaizedBevelBorder() );
refreshButton.addActionListener( this );
getContentPane().add(refreshButton, BorderLayout. NORTH );
コードセグメント 5:
public void actionPerformed( ActionEvent ae )
{
if ( ae.getActionCommand().equals( "Refresh" ) )
次に、新しい JScrollPane と JTextArea を作成し、追加しますJTextArea から JScrollPane へ。このようにして、XTree コンポーネントを含む元の JScrollPane と、JTextArea コンポーネントを含む新しい JScrollPane を取得します。この元の XTree コンストラクターにはもう 1 つ変更があります。以前にこのメソッドに渡された文字列パラメータを削除します。 (この機能は、次に構築する別の XmlEditor() コンストラクターを通じて操作されます。) これら 2 つのボックスを JSplitPane に配置します。JSplitPane は、このセパレーターの反対側にコンポーネントを含めることができるセパレーターを持つコンポーネントです。 (コード スニペット 6 を参照)。
コードセグメント 6:
jScroll = new JScrollPane();
textArea = new JTextArea().add( textArea ); xTree = 新しいXTree();
xTree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
xTree.setShowsRootHandles( true );
splitPane = new JSplitPane( JSplitPane); .HORIZONTAL_SPLIT,
jScroll, jScrollRt );
splitPane.setOneTouchEXPandable(true);
splitPane.setDividerLocation(200);
minimumSize = new Dimension(200, 150);
jScroll.setMinimumSize( minimumSize );
jScrollRt.setMinimumSize(minimumSize );
spリットペイン.setPreferredSize( new Dimension(400, 300) );
getContentPane().add( SplitPane, BorderLayout.CENTER );
次に、このコンストラクターを、この非 XML ファイルを処理する Scenario に変更する必要があります。現在のコンストラクターに必要な 2 番目の文字列パラメーターを削除します。このコンストラクターはデフォルトのコンストラクターになりました。文字列パラメーターを受け取る新しいコンストラクターを作成します。まずデフォルトのコンストラクターを呼び出してから、このパラメーターを処理します。 (コードの断片 7 を参照) さらに、XML ファイルがない場合でもデフォルトの XmlEditor オブジェクトを作成できるように、main() メソッドを変更する必要があります。 (コード スニペット 8 を参照)
コード スニペット 7:
public XmlEditor( String title, ArrayList xmlText) throws
ParserConfigurationException
{
this( title );
textArea.setText( ( String )xmlText.get( 0 ) + " " );
for ( int i = 1; i < xmlText.size(); i++ )
textArea.append( ( String )xmlText.get( i ) + " " );
xTree.refresh( textArea.getText() );
}
代码段8:
public static void main( String[] args )
{
String fileName = "";
BufferedReader リーダー;
String line;
ArrayList xmlText = null;
XmlEditor xmlEditor;
try
{
if( args.length > 0 )
{
fileName = args[0];
if ( fileName.substring( fileName. IndexOf( ´.´ ) ).equals( ".xml" ) )
{
reader = new BufferedReader( new FileReader( fileName ) );
xmlText = new ArrayList();
while ( ( line = Reader.readLine( ) ) != null )
{
xmlText.add( line );
}
reader.close();
xmlEditor = new XmlEditor( "XmlEditor 1.0", xmlText );
}
else
{
help( );
}
}
else
{
xmlEditor = new XmlEditor( "XmlEditor 1.0" );
}
}
catch( FileNotFoundException fnfEx )
{
System.out.println( fileName + " が見つかりませんでした。" );
exit();
}
catch(Exception ex )
{
ex.printStackTrace();
exit();
}
}
了很轻易地处処理のために、最後に必要な修正が必要です一般に、このセグメントを実際には長い文字列として扱うのではなく、一連の文字列として、数値集合表に含まれる文字列を表示します。これには、構築プログラムが受け取るパラメータを修正する必要があります。このデータを文字列として渡す main() メソッドのいずれかを変更します。これには、java.util パケット (コード セグメント 8 を参照) を組み込む必要もあります。须たとえば、このアプリケーション プログラムを実行し、非効率な XML データを JTextArea に入力すると、このプログラムが崩壊する可能性があります。もちろん、このような事態が発生することは想定していません。現在、問題のある情報をコマンド実行に出力しています。
非効率または不適切な形式の XML データが JTextArea に入力された後、「リフレッシュ」ボタンが選択され、その後、パーサーがエラーメッセージを表示します。この例では、parseXML() メソッドに含まれている現在の通常のプロセスが直ちに終了します。このプログラムはこの問題を報告し、この解析が失敗したことを示すために空の値を返すことを考えています。これは、XTree クラスの「buildTree()」と「refresh()」の 2 つのメソッドには、処理スペースを回避するための条件が含まれているためです。プログラム フローは実行され、XTree モデルは固定されたままになります。
最後に、このアプリケーション プログラムを検査できます。検査手順はここにあります。辑器(二)の内容、さらに多くの相关内容请关注PHP中文网(m.sbmmt.com)!