ホームページ  >  記事  >  Java  >  Java Swing を使用して XML エディタを作成する (3)

Java Swing を使用して XML エディタを作成する (3)

黄舟
黄舟オリジナル
2016-12-20 13:42:162110ブラウズ

クロスプラットフォームのオープンリソース XML エディターをお探しなら、この願いをすぐに実現できるかもしれません。この 3 部構成のシリーズでは、最も一般的な Java 2 Swing コンポーネントのいくつかを使用して、単純な XML エディターを開発する手順を説明します。このシリーズは、独自の XML エディタを作成したい人、または Swing を学習またはブラッシュアップしたい人に役立ちます。


このシリーズの3回目の記事です。最初の記事では、XML と、ツリー構造が XML の表示に適している理由、XML データの処理方法、JTree Swing コンポーネントの使用方法について簡単に説明しました。また、XML ファイルを解析して JTree Display で使用するための再利用可能なコンポーネントも構築しました。のデータ。

2 番目の記事では、XML エディターのスケルトン構造を作成しました。これを行うために、いくつかの Swing コンポーネント (jsplitPane、JScrollPane、JButton、JTextArea など) について説明しました。 JSplitPane オブジェクトには 2 つの JScrollPane オブジェクトが含まれており、1 つは XML のグラフィカル ブラウズ用で、もう 1 つはテキスト ブラウズ用です。

この最後の記事では、XML エディターをさらに使いやすくするために、最終的なインターフェイスを追加します。まずメニュー システムを構築し、次に基盤となるファイル システムにアクセスして XML ファイルを保存したり、新しいドキュメントを開いたりできるようにする JFileChooser コンポーネントの構築を続けます。最後に、ユーザーがコマンドをキャンセルしてアプリケーションを終了できるようにする JDialog ボックスを構築します。

それでは、Swing アプリケーションのパフォーマンスを強化して、メニューを利用し、ファイル システムにアクセスし、ユーザーが操作をキャンセルできるようにするにはどうすればよいでしょうか?アプリケーションのメニューを処理するための JMenu コンポーネント、基盤となるファイル システムにアクセスするための JFileChooser コンポーネント、およびユーザーが操作をキャンセルできるようにするための JDialog ボックスを作成する必要があります。

前回の記事では、XML データをグラフィカル ツリーとして表示できる JTree クラスから派生した再利用可能なコンポーネントである XTree クラスを開発しました。私たちはオブジェクト指向の原則を使用することを好むため、今日行う変更はそのクラスには影響しません。私たちはオブジェクト指向の原則を使用することを好むため、今日行う変更はそのクラスには影響しません。これは、結合されるのではなく、JFrame コンテナーによって使用される自己完結型の再利用可能なクラスです。

セクション 1 メニューコンポーネントの構築

JMenu コンポーネントには、メニューバー、1 つ以上のメニュー、1 つ以上のメニュー項目などの複数のオブジェクトが含まれています。メニュー バーにはメニューが含まれており、メニューにはメニュー項目が含まれています。これらの Swing コンポーネントの名前は非常に直感的です (それぞれ、JMenuBar、JMenu、および JMenuItem)。

これは、単一のメニュー項目を含む最小限の「ファイル」メニューを作成するコード全体です:

JMenu fileMenu = new JMenu( "File" );
JmenuItem exitItem = new JMenuItem( "Exit" );

fileMenu 。 add( exitItem );

JmenuBar menuBar = new JMenuBar();

menuBar.add( fileMenu );

setJMenuBar( menuBar );

このプロセスは私たちにはよく知られているはずで、JMenu コンポーネントは他のコンポーネントでも使用されます。 Java GUI コンポーネント ビルド時に作成されます。すべての要素に適切なコンテナが定義されるまで、最も内側の要素がその直接の親要素に追加されます。

XmlEditor のケーススタディに戻ると、新しい XML ファイルを作成し、既存のファイルを開き、ファイルを保存して終了する機能を備えた完全なファイル メニューを実際に作成しました。次のセクションで詳しく説明します。

セクション 2 メニュー イベントの処理

ユーザーが新しいドキュメントを作成し、既存のファイルを開き、現在のファイルを保存してアプリケーションを終了できるようにする典型的なファイル メニューを作成したいと考えています。このメニューの作成方法はわかったので、ユーザーのメニュー選択にどのように応答すればよいでしょうか?他の Swing コンポーネントと同様に、答えはイベント モデルと利用可能なリスナー コンポーネントにあります。

メニュー選択を処理する最も基本的な方法は、メニュー項目にアクション リスナーを追加することです: exitItem.addActionListener(new exitMenuHandler()); 複雑なイベント処理を扱う場合 (メニュー システムが非常に複雑になる可能性があるため)、eventハンドラーは別のクラスとして定義する必要があります。上記の例では、exitMenuHandler タイプのアクション リスナーを追加します。このタイプは、このアプリケーションで後ほど定義します。 exitMenuHandler クラスを定義するために必要な最小限のコードは次のとおりです。

class exitMenuHandlerimplements ActionListener {
public void actionPerformed( ActionEvent ae ) {
System.exit(0);
}
}

この実装は、 single クラス定義は単純すぎるように思えるかもしれませんが、ファイルを開いたり保存したりするためのイベント処理コードを定義すると、別個の機能を別個のクラス ファイルに配置することの重要性が理解できるでしょう。さらに、このアプローチにより、異なるアプリケーション間で共通のメニュー機能を再利用できるようになります。

セクション 3: ファイル システム アクセス コンポーネントの構築

この Java アプリケーションでは、多くの場合、ユーザーがグラフィカル ファイル システム ブラウザを通じてファイル システムにアクセスできるようにする必要があります。通常、これはユーザーがコンポーネントまたはファイルを開いたり保存したりするためです。 XmlEditor アプリケーションでは、ユーザーがこれを実行できるようにしたいと考えています。

基本的なファイル システムにアクセスするには、javax.swing パッケージに JFileChooser コンポーネントという非常に優れたコンポーネントがあります。 JFileChooser コンポーネントを利用する前に、すでに Swing アプリケーションを使用したことがあるはずです。

JFileChooser を作成するには、まず JFileChooser オブジェクトをインスタンス化し、そのサイズを設定して、ファイルを開くかファイルを保存するために使用することを宣言します。このオブジェクトをその親 (このオブジェクトをアクティブにするために使用されるオブジェクト (この場合はメニュー項目)) にリンクし、ダイアログを開くかダイアログを保存するように設定します。これを行うには、showSaveDialog() メソッドまたは showOpenDialog() メソッドを使用します。どちらも int 戻り値を返します。以下に短い例を示します:

JFileChooser jfc = new JFileChooser();
jfc.setSize( 500, 250 );
Containerparent = openItem.getParent();
int Choice = jfc.showOpenDialog(parent);

最後の行は、ユーザーが最終的にファイルを開いたり保存したり、キャンセル ボタンを押したりしたかどうかを示す整数値を返します。開く/保存イベントに応答して、この整数値は、JFileChooser クラスで定義されている APPROVE_OPTION 定数と比較できます。この時点で必要なのは、適切な方法を使用して、ユーザーが要求したファイルを開いたり保存したりすることだけです。

コード スニペット 1 を参照してください。これは、このアプリケーションの完全な実装であり、XmlEditor アプリケーションのメニュー処理関数を構築するために使用される 6 つのメソッドがすべて含まれています。

セクション 4 選択を検証するダイアログコンポーネントを構築する

これで、Jframe の閉じるウィンドウをクリックすると、アプリケーションがすぐに閉じます。これは良くない。ファイルの作業中にユーザーが誤ってウィンドウを閉じてしまったらどうなるでしょうか?ユーザーにプロンプ​​トを表示し、本当にアプリケーションを閉じたいかどうかを尋ねたいと考えています。

この目的を達成するには、JDialog ダイアログ ボックスを使用できます。すべてのグラフィック アプリケーションは、これらを使用して、別のファイルを上書きする前、保存せずにファイルを閉じる前、またはアプリケーションを閉じる前にユーザーに警告することができます。プログラミングを簡素化するために、エディターを閉じるときにユーザーに通知することに重点を置いています。

私たちがする必要があるのは、JDialog ダイアログ ボックスを作成することです。このダイアログ ボックスには、Jlabel と、プログラムを閉じるコマンドを受け取るボタンと、閉じるコマンドをキャンセルするボタンが 2 つ含まれています。プログラム。このコンポーネントを構築するコードは次のとおりです:

JDialog verifyDialog = new JDialog(this, "終了の確認", true );
Jlabel question = new JLabel( "終了してもよろしいですか?" ); = new JButton( "OK" );
okButton.addActionListener( this );
Jbutton cancelButton = new JButton( "Cancel" );
cancelButton.addActionListener( this );
verifyDialog.getContentPane().setLayout( new FlowLayout() );
verifyDialog.getContentPane().add( question );
verifyDialog.getContentPane().add( okButton );
verifyDialog.getContentPane().add( cancelButton );
verifyDialog.hide();

残り 2 つです 何も行われませんでした。これら 2 つのボタンのイベント処理コードを作成し、ウィンドウを閉じるイベントの動作をこれらのボタンに置​​き換える必要があります。これら 2 つのボタンの処理に関する限り、[OK] が押されたときにアプリケーションを閉じ、[キャンセル] が押されたときにダイアログを非表示にするだけです。

最後のステップは、デフォルトのウィンドウを閉じるイベントアクションをオーバーライドすることです。デフォルトでは、ダイアログ ボックスを作成し、ユーザーがキャンセル ボタンをクリックした場合でも、JFrame はウィンドウを閉じるイベントを受け取ります。これにより、次の設定でオーバーライドしない限り、JFrame 自体が非表示になります:

setDefaultCloSEOperation( JFrame.DO_NOTHING_ON_CLOSE ); 新しい設定は、ウィンドウを閉じるイベントに応答して自動的に閉じることはありません。 System.exit() 呼び出しに応答してそれ自体を閉じるだけです。

メニュー コンポーネントを追加し、メニュー イベントのイベント ハンドラーを定義し、予期しないウィンドウを閉じるイベントをキャンセルするメソッドを追加したら、アプリケーションをテストして XML ファイルの作成、編集、保存を開始できます。

おめでとうございます!おめでとう!すでに手書きの Swing ベースの XML エディターを持っています。残りの作業はあなた次第です。検証し、堅牢性を高め、場合によっては新しい機能を追加する必要があります。

添付: コード スニペット 1

class newMenuHandlerimplements ActionListener
{
public void actionPerformed ( ActionEvent ae )
{
textArea.setText( "" );
try
{ // 新しい XTree を作成します
xTree = new XTree ( );
;
}
  catch( Exception ex )
{
String message = ex.getMessage();
ex.printStackTrace();
}
file://结束try/catch
}
file://结束actionPerformed()
}
file ://结束class newMenuHandler
class openMenuHandlerimplements ActionListener
{
JFileChooser jfc;
Containerparent;
int Choice;
openMenuHandler()
{
super();
jfc = new JFileChooser();
jfc.setSize( 00,300 );
jfc.setFileFilter( new XmlFileFilter() );
parent = openItem.getParent(); }
file://结束openMenuHandler()
class openMenuHandlerimplements ActionListener
{
JFileChooser jfc;
Containerparent;
int Choice;

openMenuHandler()
{
super();
jfc = new JFileChooser();
jfc.setSize( 400,300 );
jfc.setFileFilter( new XmlFileFilter() );

parent = openItem.getParent();
}
public void actionPerformed( ActionEvent ae )
{

choice =ダイアログ(親) ;

if ( Choice == JFileChooser.APPROVE_OPTION )
{
String fileName, line;
BufferedReader Reader;

fileName = jfc.getSelectedFile().getAbsolutePath();

try
{
reader = new BufferedReader(
new FileReader( fileName ) );

textArea.setText( Reader.readLine() + " " );

while ( ( line = Reader.readLine() ) != null )
{
textArea.append( line + " " );
}
reader.close();

xTree.refresh( textArea.getText() );
}
catch ( Exception ex )
{
String message = ex.getMessage();
ex.printStackTrace( );
}

jfc.setCurrentDirectory( new File( fileName ) );
}

}
}
class saveMenuHandlerimplements ActionListener
{
JFileChooser jfc;
Containerparent;
int Choice;

saveMenuHandler()
{
super();
jfc = new JFileChooser();
jfc.setSize( 400,300 );
jfc.setFileFilter( new XmlFileFilter() );

parent = saveItem.getParent();
}

public voidアクションの実行( ActionEvent ae )
{

choice = jfc.showSaveDialog(parent );

if ( Choice == JFileChooser.APPROVE_OPTION )
{
String fileName;
File fObj;
FileWriter Writer;

fileName = jfc.getSelectedFile() .getAbsolutePath();

try
{
writer = new FileWriter( fileName );

textArea.write(writer );

writer.close();
}
catch ( IOException ioe )
{
ioe.printStackTrace ();
}
jfc.setCurrentDirectory( new File( fileName ) );
}

}
}

class exitMenuHandlerimplements ActionListener
{
public void actionPerformed( ActionEvent ae )
{
verifyDialog.show( );
}
}
class XmlFileFilter extends javax.swing.filechooser.FileFilter
{
public boolean accept( File fobj )
{
if ( fobj.isDirectory() )
return true;
else
return fobj.getName().endsWith ( ".xml" );
}

public String getDescription()
{
return "*.xml";
}
}

以上は Java Swing 创建一 XML 编辑器(三)の内容です。相关内容请关注PHP中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。