Heim  >  Artikel  >  Java  >  Erstellen Sie einen XML-Editor mit Java Swing (2)

Erstellen Sie einen XML-Editor mit Java Swing (2)

黄舟
黄舟Original
2016-12-20 13:41:031964Durchsuche

Dies ist der zweite Artikel dieser Serie. Im vorherigen Artikel haben wir kurz XML besprochen und erläutert, warum eine Baumstruktur für die Anzeige von XML geeignet ist, wie XML-Daten verarbeitet werden, wie die JTree Swing-Komponente verwendet wird und wie ein wiederverwendbares XML-Dokument erstellt und Daten in einer Jtree-Komponente angezeigt werden.
 

In diesem Artikel erstellen wir das Framework unseres XML-Editors. Um diesen Zweck zu erreichen, verwenden wir viele Swing-Komponenten (einschließlich jsplitPane-, JscrollPane-, Jbutton- und JtextArea-Komponenten).

1. Problemstellung und Lösung

Wie erstelle ich einen XML-Texteditor, der Text durchsuchen und Ansichten durchsuchen kann? Erstellen Sie ein Jframe-Objekt, das Jbutton und JsplitPane enthält, und lassen Sie das JsplitPane-Objekt dann zwei JscrollPane-Objekte enthalten, eines zum Durchsuchen von Grafiken (xTree-Klasse) und das andere zum Durchsuchen von Text (JtextArea-Klasse). Jbutton wird verwendet, um den Vorgang der Aktualisierung des grafischen Browsens zu verwalten.

2. Erweitern Sie die Funktionen der Xtree-Klasse

Im vorherigen Artikel haben wir die Xtree-Klasse entwickelt, eine wiederverwendbare Komponente, die die Jtree-Klasse fortsetzt und XML-Daten in „Displayed in“ konvertieren kann die Form eines grafischen Baumes. Wir werden diese Klasse nun erweitern, indem wir ihr einen Standard-XML-Baum zur Verfügung stellen, der für den Fall angezeigt wird, dass keine XML-Datei in der Befehlszeile bereitgestellt wird. Darüber hinaus werden wir auch einige Fehlerbehandlungslogiken hinzufügen, damit das Programm nicht abstürzt zu ungültigem XML.

Der erste Schritt besteht darin, eine Methode namens buildTree() zu erstellen:

private DefaultTreeModel buildTree( String text )

{

DefaultMutableTreeNode treeNode;

 Node newNode;

 // Nehmen Sie den DOM-Wurzelknoten und konvertieren Sie ihn in ein Baummodell

 newNode = parseXml( text );

if ( newNode ! = null )

 {

 treeNode = createTreeNode( newNode );

  return new DefaultTreeModel( treeNode );

 }

else

 return null;

 } file://end buildTree()

  Diese Methode ruft den eingehenden XML-String ab, analysiert den XML-String und erstellt eine DefaultTreeModel-Variableninstanz Erstellen Sie eine grafische Baumstruktur aus Daten. Diese Funktionalität war ursprünglich im XTree()-Konstruktor enthalten, aber wir haben sie herausgenommen und in eine separate Methode eingefügt, damit wir die Flexibilität haben, einen Standard-Grafikbaum zu erstellen. Das wollen wir als nächstes tun.

Der nächste Schritt besteht darin, eine Methode namens buildWelcomeTree() zu erstellen. Diese Methode erstellt eine DefaultTreeModel-Variable einzeln, anstatt eine vorhandene XML-Literalzeichenfolge zu analysieren. Wenn der Benutzer diese Anwendung startet, ohne eine XML-Datei anzugeben, wird das DefaultTreeModel angezeigt. Siehe Codeausschnitt 1

Codeausschnitt 1:

private DefaultTreeModel buildWelcomeTree()
{
DefaultMutableTreeNode root;
DefaultMutableTreeNode instrUCtions, OpeningDoc,
editDoc, savingDoc;
DefaultMutableTreeNode-Öffnen von DocText, Bearbeiten von DocText,
Speichern von DocText;
DefaultMutableTreeNode-Entwicklung, Hinzufügen von Funktionen, Kontaktieren von Kyle;

root = new DefaultMutableTreeNode( "Willkommen bei XML View 1.0" );
Anweisungen = neuer DefaultMutableTreeNode ( "Instructions" );
openingDoc = new DefaultMutableTreeNode
    ( "Opening XML Documents" );
 openingDocText = new DefaultMutableTreeNode
  🎜>In der Befehlszeile müssen Sie den Dateinamen angeben." );
editingDoc = new DefaultMutableTreeNode
🎜> kann direkt bearbeitet werden.
Die Schaltfläche „Aktualisieren“ erstellt den JTree im linken Frame neu DefaultMutableTreeNode
( „Diese Iteration des ;
Anweisungen.add( OpeningDoc );
Anweisungen.add( EditingDoc );
OpeningDoc.add( OpeningDocText );
EditingDoc.add( EditingDocText );
Return New DefaultTreeModel( Root ) ;
}

Als nächstes müssen wir einen neuen Konstruktor hinzufügen, um die Standardanzeigefunktionalität zu vereinfachen. Wir werden den Hauptkonstruktor so ändern, dass er keine Parameter akzeptieren kann, und einen neuen Konstruktor erstellen, der eine einzelne XML-Textzeichenfolge akzeptiert. Auf diese Weise wird ein Standard-XTree-Objekt erstellt, wenn kein XML-Text angezeigt wird, und ein eindeutiges XTree-Objekt, wenn XML-Text angezeigt wird. In Codefragment 2 sind zwei Konstruktoren angegeben.

Codeausschnitt 2:

public public XTree() throws ParserConfigurationException
{
super();
dbf = DocumentBuilderFactory.newInstance();
dbf. setValidating( false );
db = dbf.newDocumentBuilder();
setModel( buildWelcomeTree() );
}

3. Erstellen Sie die XmlEditor-Klasse

Der XmlEditor Die Klasse hat denselben Zweck wie die XTreeTester-Klasse im vorherigen Artikel. Der Unterschied besteht darin, dass XmlEditor eine JTextArea enthält, mit der Sie die Textversion von XML bedienen können. Anschließend können Sie auf die Schaltfläche „Aktualisieren“ klicken und die Änderungen sehen, die sich in der XTree-Komponente widerspiegeln.

Wenn Sie den Code im ersten Artikel direkt ändern, können Sie viel Zeit sparen. Sie können die Datei XTreeTester.java in XmlEditor.java umbenennen (Sie müssen jedoch den Konstruktor ändern) und als verwenden Vorlagedokument.

Als Erstes müssen Sie die folgenden Swing-Komponenten hinzufügen: ein weiteres JScrollPane, ein JSplitPane, eine JTextArea und einen JButton. Beginnen Sie mit der Deklaration aller dieser und weiterer Komponenten (siehe Codeausschnitt 3).

Codeausschnitt 3:

private XTree xTree;
private JScrollPane jScroll, jScrollRt;
private JSplitPane splitPane;
private JButton restartButton;

Zuerst , werden wir die Schaltfläche „Aktualisieren“ erstellen und hinzufügen. Mit dieser Schaltfläche wird angegeben, dass diese XTree-Komponente mit dem aktuellen XML-Text aktualisiert wird. Wir müssen auch einen ActionListener verwenden, um es zu registrieren. (Siehe Codeausschnitt 4) Um Schaltflächenereignisse abzufangen, müssen wir diese Klasse haben und ActionListener implementieren, außerdem müssen wir eine actionPerformed()-Methode erstellen (siehe Codeausschnitt 5).

Codeausschnitt 4:

refreshButton = new JButton( "Refresh" );
refreshButton.setBorder(
BorderFactory.createRaisedBevelBorder() );
refreshButton.addActionListener( this );
getContentPane().add( refreshButton, BorderLayout.NORTH );

Codesegment 5:

public void actionPerformed( ActionEvent ae )
{
if ( ae.getActionCommand().equals( "Refresh" ) )
  xTree.refresh( textArea.getText() );
}

Als nächstes erstellen wir neue JScrollPane und JTextArea und fügen JTextArea hinzu zu JScrollPane. Auf diese Weise erhalten wir das ursprüngliche JScrollPane mit der XTree-Komponente und das neue JScrollPane mit der JTextArea-Komponente. Es gibt noch eine weitere Änderung an diesem ursprünglichen XTree-Konstruktor. Wir werden den zuvor an diese Methode übergebenen String-Parameter entfernen. (Diese Funktionalität wird über einen anderen XmlEditor()-Konstruktor betrieben, den wir als Nächstes erstellen werden.) Wir fügen diese beiden Boxen in ein JSplitPane ein, eine Komponente mit einem Trennzeichen, das auf der anderen Seite dieses Trennzeichens eine Komponente eingefügt werden kann. (Siehe Codeausschnitt 6).

Codeausschnitt 6:

jScroll = new JScrollPane();
jScrollRt = new JScrollPane();

textArea = new JTextArea( 200,150 );
jScrollRt.getViewport().add( textArea );

xTree = new XTree();
xTree.getSelectionModel().setSelectionMode(
 TreeSelectionModel.SINGLE_TREE_SELECTION );
xTree.setShowsRootHandles( true );

xTree.setEditable( false );

jScroll.getViewport().add( xTree );

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 );

splitPane.setPreferredSize( new Dimension(400, 300) );

getContentPane().add( splitPane, BorderLayout.CENTER );

Jetzt müssen wir den Konstruktor ändern, um das Szenario mit Nicht-XML-Dateien zu bewältigen. Entfernen Sie den zweiten String-Parameter, der vom aktuellen Konstruktor benötigt wird. Dieser Konstruktor ist jetzt der Standardkonstruktor. Wir erstellen einen neuen Konstruktor, um einen String-Parameter zu empfangen. Zuerst wird der Standardkonstruktor aufgerufen und dann dieser Parameter verarbeitet. (Siehe Codefragment 7) Darüber hinaus muss die Methode main() so geändert werden, dass auch dann ein Standard-XmlEditor-Objekt erstellt werden kann, wenn keine XML-Datei vorhanden ist. (Siehe Codeausschnitt 8)

Codeausschnitt 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 read;
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 = neuer XmlEditor ( "XmlEditor 1.0", xmlText );
}
else
{
help();
}

}
else
{
xmlEditor = new
exit();
}
catch( Exception ex )
{
ex.printStackTrace();
exit();
}
}

  为了很轻易地处理 JTextArea数据,还需要最后一次必要的修改.一般我们不把这段文本当成一个长的字符串,而是把它当成一系列字符串,每行表示一个包含在数组的字符串个字符串传入的那个main()方法中的任何调用。这还需要导入java.util包 (参见代码段8 ). XTree ist eine Datei, die in der XML- und JTextArea-App verfügbar ist这个程序就会崩溃.我们当然不想这样的事情发生。目前,我们把出错信息打印到命令行中。在下一篇文章中,我们将在一个图形对话框中显示出错信息.

Die XML-Version der JTextArea-App ist mit „Refresh“ ausgestattet Sie können parseXML() verwenden, um die Funktion des Benutzers zu nutzen想要这个程序报告这个错误并返回一个空值来指出这个解析是不成功的.(见代码段9)你可Die XTree-Funktion wird mit „buildTree()“ und „refresh()“ verwendet有一个条件语句以避免处理空值.这是因为假如它们试着去处理一个空值它们也会报告异常.这个事件链保持程序流进行并且保持 XTree模型稳定.

  最后,我们就可以测试这个应用程序,测试过程我在这里就不多说了. 

 以上就是使用Java Swing XML-Version (nicht verfügbar), PHP-Version (nicht verfügbar) www.php.cn)! 



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn