>  기사  >  Java  >  Java Swing을 사용하여 XML 편집기 만들기(2)

Java Swing을 사용하여 XML 편집기 만들기(2)

黄舟
黄舟원래의
2016-12-20 13:41:032033검색

이 시리즈의 두 번째 기사입니다. 이전 기사에서는 xml과 트리 구조가 XML 표시에 적합한 이유, XML 데이터 처리 방법, JTree Swing 구성 요소 사용 방법, 재사용 가능한 XML 문서 생성 및 Jtree 구성 요소에 데이터 표시 방법에 대해 간략하게 설명했습니다.
 

이 기사에서는 이 목적을 달성하기 위해 많은 Swing 구성요소(jsplitPane, JscrollPane, Jbutton 및 JtextArea 구성요소 포함)를 사용합니다.

1. 문제 제기 및 해결 방법

텍스트 탐색 및 뷰 탐색이 가능한 XML 텍스트 편집기를 만들려면 어떻게 해야 하나요? Jbutton 및 JsplitPane을 포함하는 Jframe 개체를 만든 다음 JsplitPane 개체에 두 개의 JscrollPane 개체가 포함되도록 합니다. 하나는 그래픽 검색용(xTree 클래스)이고 다른 하나는 텍스트 검색용(JtextArea 클래스)입니다. Jbutton은 그래픽 탐색 새로 고침 작업을 관리하는 데 사용됩니다.

2. Xtree 클래스의 기능 강화

이전 글에서는 Jtree 클래스를 이어가며 XML 데이터를 Displayed로 변환할 수 있는 재사용 가능한 컴포넌트인 Xtree 클래스를 개발했습니다. 그래픽 트리 형태. 이제 XML 파일이 명령줄에 제공되지 않은 경우 표시할 기본 XML 트리를 사용하여 해당 클래스를 향상시키고 프로그램이 충돌하지 않도록 일부 오류 처리 논리도 추가할 것입니다. 잘못된 XML로.

첫 번째 단계는 buildTree()라는 메서드를 만드는 것입니다.

private DefaultTreeModel buildTree( String text )

{

DefaultMutableTreeNode treeNode;

 Node newNode;

 // DOM 루트 노드를 가져와 트리 모델로 변환

 newNode =parseXml( text );

if ( newNode ! = null )

 {

 treeNode = createTreeNode( newNode );

  return new DefaultTreeModel( treeNode );

 }

else

 return null;

 } file://end buildTree()

  이 메서드는 들어오는 XML 문자열을 가져오고, XML 문자열을 분석하고, 다음 작업에 사용되는 DefaultTreeModel 변수 인스턴스를 구성합니다. 데이터로부터 그래픽 트리 구조를 구성합니다. 이 기능은 원래 XTree() 생성자에 포함되어 있었지만 기본 그래픽 트리를 유연하게 생성할 수 있도록 이를 꺼내서 별도의 메서드에 넣었습니다. 그것이 우리가 다음에 하고 싶은 일입니다.

다음 단계는 buildWelcomeTree()라는 메서드를 만드는 것입니다. 이 메서드는 기존 XML 리터럴 문자열을 구문 분석하는 대신 한 번에 하나씩 DefaultTreeModel 변수를 작성합니다. 사용자가 XML 파일을 지정하지 않고 이 애플리케이션을 시작하면 DefaultTreeModel이 표시됩니다. 코드 조각 1 보기

코드 조각 1:

private DefaultTreeModel buildWelcomeTree()
{
DefaultMutableTreeNode root;
DefaultMutableTreeNode instrUCtions, openingDoc,
editDoc, savingDoc;
DefaultMutableTreeNode openingDocText, editDocText,
savingDocText;
DefaultMutableTreeNode 개발, 추가 기능, contactingKyle;

root = new DefaultMutableTreeNode( "XML View 1.0에 오신 것을 환영합니다" );
지침 = 새로운 DefaultMutableTreeNode ( "Instructions" );
openingDoc = new DefaultMutableTreeNode
    ( "Opening XML Documents" );
 openingDocText = new DefaultMutableTreeNode
  🎜>명령줄에서는 파일 이름을 지정해야 합니다." );
editingDoc = new DefaultMutableTreeNode
🎜> 직접 편집할 수 있습니다.
"새로 고침" 버튼을 누르면 왼쪽 프레임의 JTree가 다시 작성됩니다." ); XML 문서 저장" );
savingDocText = new DefaultMutableTreeNode
( "이번 XmlEditor 반복은

문서를 저장하는 기능을 제공하지 않습니다. 이는
  다음 기사와 함께 제공됩니다." );
root .add( 지침 ) ;
Instructions.add( openingDoc );
Instruction.add( editDoc );
openingDoc.add( openingDocText );
editDoc.add( editDocText );
새 DefaultTreeModel( 루트 ) 반환 ;
}

다음으로 기본 표시 기능을 단순화하기 위해 새 생성자를 추가해야 합니다. 기본 생성자를 수정하여 매개 변수를 허용하지 않고 단일 XML 텍스트 문자열을 허용하는 새 생성자를 만듭니다. 이런 방식으로 XML 텍스트가 표시되지 않으면 기본 XTree 개체가 생성되고, XML 텍스트가 표시되면 고유한 XTree 개체가 생성됩니다. 코드 조각 2에는 두 개의 생성자가 제공됩니다.

코드 조각 2:

public public XTree()가 ParserConfigurationException을 발생시킵니다
{
super();
dbf = DocumentBuilderFactory.newInstance();
dbf. setValidating( false );
db = dbf.newDocumentBuilder();
setModel( buildWelcomeTree() );
}

3 XmlEditor 클래스를 만듭니다.

XmlEditor 클래스는 이전 기사의 XTreeTester 클래스와 동일한 목적을 가지고 있습니다. 차이점은 XmlEditor에 XML의 텍스트 버전을 작동할 수 있는 JTextArea가 포함되어 있다는 것입니다. 그런 다음 "새로 고침" 버튼을 클릭하면 XTree 구성 요소에 반영된 변경 사항을 확인할 수 있습니다.

첫 번째 글의 코드를 직접 수정하면 시간을 많이 절약할 수 있습니다. XTreeTester.java 파일의 이름을 XmlEditor.java로 변경하고(단, 생성자는 수정해야 함) a로 사용할 수 있습니다. 템플릿 문서.

가장 먼저 해야 할 일은 또 다른 JScrollPane, JSplitPane, JTextArea 및 JButton과 같은 Swing 구성 요소를 추가하는 것입니다. 이러한 모든 구성 요소와 기타 구성 요소를 선언하는 것부터 시작하세요(코드 조각 3 참조).

코드 조각 3:

private XTree xTree;
private JScrollPane jScroll, jScrollRt;
private JSplitPane SplitPane;
private JButton RefreshButton;
private WindowListener winClosing;

먼저 '새로고침' 버튼을 생성하고 추가하겠습니다. 이 버튼은 이 XTree 구성 요소가 현재 XML 텍스트로 새로 고쳐짐을 나타내는 데 사용됩니다. 또한 이를 등록하려면 ActionListener를 사용해야 합니다. (코드 조각 4 참조) 버튼 이벤트를 가로채려면 이 클래스가 있어야 하고 ActionListener를 구현해야 하며, actionPerformed() 메서드도 만들어야 합니다(코드 조각 5 참조).

코드 조각 4:

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

코드 세그먼트 5:

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

다음으로 새 JScrollPane 및 JTextArea를 만들고 JTextArea를 추가합니다. JScrollPane에. 이러한 방식으로 XTree 구성 요소가 포함된 원본 JScrollPane과 JTextArea 구성 요소가 포함된 새 JScrollPane을 얻게 됩니다. 이 원본 XTree 생성자에는 수정 사항이 하나 더 있습니다. 이전에 이 메소드에 전달된 문자열 매개변수를 제거하겠습니다. (이 기능은 다음에 빌드할 다른 XmlEditor() 생성자를 통해 작동됩니다.) 이 두 상자를 JSplitPane에 넣습니다. JSplitPane은 이 구분 기호의 반대편에 포함될 수 있는 구분 기호가 있는 구성 요소입니다. (코드 조각 6 참조)

코드 조각 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( 최소 크기 );
jScrollRt.setMinimumSize( 최소 크기 );

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

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

이제 비XML 파일 시나리오를 처리하기 위해 생성자를 수정해야 합니다. 현재 생성자에 필요한 두 번째 문자열 매개변수를 제거합니다. 이제 이 생성자가 기본 생성자가 됩니다. 문자열 매개변수를 받기 위한 새로운 생성자를 생성하겠습니다. 먼저 기본 생성자를 호출한 다음 이 매개변수를 처리합니다. (코드 조각 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 reader;
String line;
ArrayList xmlText = null;
XmlEditor xmlEditor;

시도
{
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 = 새로운 XmlEditor ( "XmlEditor 1.0", xmlText );
}
else
{
help();
}

}
else
{
xmlEditor = new XmlEditor( "XmlEditor 1.0" );
}
}
catch( FileNotFoundException fnfEx )
{
System.out.println( fileName + " 찾을 수 없습니다." );
exit();
}
catch( 예외 ex )
{
ex.printStackTrace();
exit();
}
}

  为了很轻易地处理 JTextArea数据,还需要最后一次必要的修改。是把它当成一系列字符串,每行表示一个包含在数组列表中字符串.这需要修改我们的构造程序接收的参数,并且修改先前把这个数据据一个字符传入的那个main()방법중에서 사용됩니다. 这还需要导入 java.util包 (参见代码段8 ) 。

  测试这个应用程序

  最后,我们必须添加一些异常处理到 XTree类中.假如你运行这个应用程序并输入无效的XML数据到 JTextArea中,这个程序就会崩溃。我们当然不想这样的事情发生。目前,我们把ude错信息打印到命令行中。下一篇文章中,我们将with一个图形对话框中显示流错信息。

  假如无效或格式好적 XML 数据被输入 JTextArea然后按 "Refresh" 는 然后解析器将抛一个错误, 에서 本例中,parseXML() 방법中包含的当前异常处理将立即退流.我们想要这个程序报告这个错误并返回一个空值来指流这个解析是不成功的 . ee()”와 “refresh()”를 사용하는 방법值它们也会报告异常。这个个件链持程序流进行并且保持 XTree模型稳定。

  最后,我们就可以测试这个应用程序,测试过程我는여기에있습니다容,更多相关内容请关注PHP中文网( www.php.cn)! 

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.