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

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

黄舟
黄舟원래의
2016-12-20 13:42:162110검색

크로스 플랫폼, 오픈 리소스 XML 편집기를 찾고 계시다면 곧 이러한 바람을 실현하실 수 있을 것입니다. 세 부분으로 구성된 이 시리즈에서는 가장 일반적인 Java 2 Swing 구성 요소 중 일부를 사용하여 간단한 XML 편집기를 개발하는 과정을 안내합니다. 이 시리즈는 자신만의 XML 편집기를 작성하려는 사람들이나 Swing을 배우거나 복습하는 데 도움이 되는 사람들에게 도움이 될 것입니다.
 

 이 시리즈의 세 번째 기사입니다. 첫 번째 기사에서는 XML과 트리 구조가 XML 표시에 적합한 이유, XML 데이터 처리 방법, JTree Swing 구성 요소 사용 방법에 대해 간략하게 설명했으며 XML 파일을 구문 분석하고 JTree Display에서 사용하기 위해 재사용 가능한 구성 요소도 구축했습니다. .

두 번째 기사에서는 XML 편집기의 뼈대 구조를 만들었습니다. 이를 위해 우리는 다양한 Swing 구성 요소(jsplitPane, JScrollPane, JButton 및 JTextArea 포함)에 대해 이야기했습니다. JSplitPane 객체에는 두 개의 JScrollPane 객체가 포함되어 있습니다. 하나는 XML 그래픽 탐색용이고 다른 하나는 텍스트 탐색용입니다.

이 마지막 기사에서는 XML 편집기에 최종 인터페이스를 추가하여 더욱 사용자 친화적으로 만들겠습니다. 먼저 메뉴 시스템을 구축한 다음 XML 파일을 저장하고 새 문서를 열 수 있도록 기본 파일 시스템에 액세스하는 JFileChooser 구성 요소를 계속 구성합니다. 마지막으로 사용자가 명령을 취소하고 응용 프로그램을 종료할 수 있게 해주는 JDialog 상자를 구축하겠습니다.

그렇다면 메뉴를 활용하고, 파일 시스템에 액세스하고, 사용자가 작업을 취소할 수 있도록 Swing 애플리케이션의 성능을 어떻게 향상시킬 수 있을까요? 애플리케이션의 메뉴를 처리하기 위한 JMenu 컴포넌트, 기본 파일 시스템에 액세스하기 위한 JFileChooser 컴포넌트, 사용자가 작업을 취소할 수 있도록 하는 JDialog 상자를 생성해야 합니다.

이전 기사에서는 XML 데이터를 그래픽 트리로 표시할 수 있는 JTree 클래스에서 파생된 재사용 가능한 컴포넌트인 XTree 클래스를 개발했습니다. 우리는 객체지향 원칙을 사용하기를 좋아하기 때문에 오늘 우리가 변경하는 내용은 해당 클래스에 영향을 미치지 않습니다. 우리는 객체지향 원칙을 사용하기를 좋아하기 때문에 오늘 우리가 변경하는 내용은 해당 클래스에 영향을 미치지 않습니다. 이는 결합되지 않고 JFrame 컨테이너에서 사용되는 자체 포함된 재사용 가능한 클래스입니다.

섹션 1 메뉴 구성요소 작성

JMenu 구성요소에는 메뉴 표시줄, 하나 이상의 메뉴, 하나 이상의 메뉴 항목 등 여러 개체가 포함됩니다. 메뉴 표시줄에는 메뉴 항목이 포함된 메뉴가 포함되어 있습니다. 이러한 Swing 구성 요소의 이름은 매우 직관적입니다(각각 JMenuBar, JMenu 및 JMenuItem).

단일 메뉴 항목을 포함하는 최소 "파일" 메뉴를 생성하는 전체 코드는 다음과 같습니다.

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

fileMenu.add(exitItem);

JmenuBar menuBar = new JMenuBar();

menuBar.add( fileMenu );

setJMenuBar( menuBar );

우리는 이 프로세스에 매우 익숙해야 합니다. JMenu 구성 요소는 다른 Java GUI 구성 요소가 빌드될 때 생성됩니다. 가장 안쪽 요소는 모든 요소에 적절한 컨테이너가 정의될 ​​때까지 바로 상위 요소에 추가됩니다.

XmlEditor 사례 연구로 돌아가서 실제로 새 XML 파일 생성, 기존 파일 열기, 파일 저장 및 종료 기능을 갖춘 완전한 파일 메뉴를 만들었습니다. 이에 대해서는 다음 섹션에서 더 자세히 설명하겠습니다.

섹션 2 메뉴 이벤트 처리

우리는 사용자가 새 문서를 만들고, 기존 파일을 열고, 현재 파일을 저장하고, 응용 프로그램을 종료할 수 있는 일반적인 파일 메뉴를 만들고 싶습니다. 이제 이 메뉴를 만드는 방법을 알았으니 사용자의 메뉴 선택에 어떻게 반응해야 할까요? 다른 Swing 구성 요소와 마찬가지로 답은 이벤트 모델과 사용 가능한 리스너 구성 요소에 있습니다.

메뉴 선택을 처리하는 가장 기본적인 방법은 메뉴 항목에 액션 리스너를 추가하는 것입니다. 복잡한 이벤트 처리를 처리할 때(메뉴 시스템이 매우 변경될 수 있으므로) 복잡함), 이벤트 핸들러는 별도의 클래스로 정의되어야 합니다. 위에 제공된 예에서는 exitMenuHandler 유형의 작업 리스너를 추가합니다. 이 유형은 이 애플리케이션의 뒷부분에서 정의됩니다. 다음은 exitMenuHandler 클래스를 정의하는 데 필요한 최소 코드입니다.

classexitMenuHandler Implements ActionListener {
public void actionPerformed( ActionEvent ae ) {
System.exit(0);
}
}

이 구현은 단일 클래스의 정의를 보여주기에는 지나치게 단순해 보일 수 있지만 파일 열기 및 저장을 위한 이벤트 처리 코드를 정의하면 별도의 기능에 익숙해질 수 있습니다. 속성을 별도의 클래스 파일로 분리합니다. 또한 이 접근 방식을 사용하면 다양한 애플리케이션에서 공통 메뉴 기능을 재사용할 수 있습니다.

섹션 3 파일 시스템 액세스 구성 요소 구축

이 Java 애플리케이션은 사용자가 그래픽 파일 시스템 브라우저를 통해 파일 시스템에 액세스할 수 있도록 허용해야 하는 경우가 많습니다. 일반적으로 이는 사용자가 구성 요소나 파일을 열거나 저장하기를 원하기 때문입니다. XmlEditor 응용 프로그램에서는 사용자가 이 작업을 수행할 수 있기를 원합니다.

기본 파일 시스템에 액세스하기 위해 javax.swing 패키지에는 매우 유용한 구성 요소인 JFileChooser 구성 요소가 있습니다. 의심할 바 없이 JFileChooser 구성 요소를 활용하기 전에 이미 Swing 응용 프로그램을 사용해 본 적이 있을 것입니다.

JFileChooser를 생성하려면 먼저 JFileChooser 객체를 인스턴스화하고 크기를 설정한 다음 파일을 열거나 파일을 저장하는 데 사용하도록 선언합니다. 이 개체를 해당 부모(활성화하는 데 사용된 개체(이 경우 메뉴 항목))에 연결한 다음 대화 상자를 열거나 대화 상자를 저장하도록 설정합니다. 이를 수행하려면 int 반환 값을 반환하는 showSaveDialog() 또는 showOpenDialog() 메서드를 사용합니다. 다음은 간단한 예입니다.

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

마지막 줄에 반환된 정수 값은 사용자가 최종적으로 파일을 열거나 저장했는지 또는 취소 버튼을 눌렀는지 여부를 나타냅니다. 열기/저장 이벤트에 대한 응답으로 이 정수 값은 JFileChooser 클래스에 정의된 APPROVE_OPTION 상수와 비교할 수 있습니다. 이 시점에서는 사용자가 요청한 파일을 열거나 저장하기 위해 적절한 방법을 사용하기만 하면 됩니다.

이 애플리케이션의 전체 구현인 코드 조각 1을 참조하세요. 여기에는 XmlEditor 애플리케이션의 메뉴 처리 기능을 구성하는 데 사용되는 6가지 메서드가 모두 포함되어 있습니다.

섹션 4 선택 사항을 검증하기 위한 대화 상자 구성 요소 구축

이제 Jframe의 닫기 창을 클릭하면 애플리케이션이 즉시 닫힙니다. 이것은 좋지 않습니다. 사용자가 파일 작업 중에 실수로 창을 닫은 경우 어떻게 되나요? 우리는 사용자에게 메시지를 표시하고 정말로 애플리케이션을 닫을 것인지 묻고 싶습니다.

JDialog 대화 상자를 사용하여 이 목적을 달성할 수 있습니다. 모든 그래픽 응용 프로그램은 이를 사용하여 다른 파일을 덮어쓰기 전, 저장하지 않고 파일을 닫기 전, 응용 프로그램을 닫기 전에 사용자에게 경고할 수 있습니다. 프로그래밍을 단순화하기 위해 우리는 편집기를 닫을 때 사용자에게 상기시키는 데 중점을 둡니다.

우리가 해야 할 일은 JDialog 대화 상자를 만드는 것뿐입니다. 이 대화 상자에는 Jlabel이 포함되어 있으며 하나는 프로그램을 닫는 명령을 수신하고 다른 하나는 취소하는 단추입니다. 프로그램을 닫는 명령입니다. 다음은 이 구성 요소를 구성하는 코드입니다.

JDialog verifyDialog = new JDialog( this, "Confirm Exit", true );
Jlabel 질문 = new JLabel( "종료하시겠습니까? " ) ;
Jbutton okButton = new JButton( "OK" );
okButton.addActionListener( this );
Jbutton cancelButton = new JButton( "Cancel" );
cancelButton.addActionListener( this ) ;
verifyDialog.getContentPane().setLayout( new FlowLayout() );
verifyDialog.getContentPane().add( 질문 );
verifyDialog.getContentPane().add( okButton );
verifyDialog .getContentPane ().add( cancelButton );
verifyDialog.hide();

이제 해야 할 일이 두 가지 남았습니다. 이 두 버튼에 대한 이벤트 처리 코드를 작성하고 창 닫기 이벤트 동작을 해당 버튼으로 바꿔야 합니다. 이 두 버튼을 처리하는 데 있어서 확인을 누르면 응용 프로그램을 닫고 취소를 누르면 대화 상자를 숨깁니다.

마지막 단계는 기본 창 닫기 이벤트 동작을 재정의하는 것입니다. 기본적으로 대화 상자를 만들고 사용자가 취소 버튼을 클릭하더라도 JFrame은 여전히 ​​창 닫기 이벤트를 받습니다. 이렇게 하면 다음 설정으로 재정의하지 않는 한 JFrame이 숨겨집니다.

setDefaultCloSEOperation( JFrame.DO_NOTHING_ON_CLOSE )

새 설정은 창 닫기 이벤트에 대한 응답으로 절대 닫히지 않습니다. . System.exit() 호출에 대한 응답으로만 닫힙니다.

메뉴 구성 요소를 추가하고, 메뉴 이벤트에 대한 이벤트 핸들러를 정의하고, 예기치 않은 창 닫기 이벤트를 취소하는 메서드를 추가하고 나면 애플리케이션을 테스트하고 XML 파일 생성, 편집 및 저장을 시작할 수 있습니다.

축하합니다! 축하해요! 이미 손으로 작성한 Swing 기반 XML 편집기가 있습니다. 나머지 작업은 귀하에게 달려 있습니다. 이를 확인하고 견고성을 높이고 몇 가지 새로운 기능을 추가해야 할 수도 있습니다.

첨부 파일: 코드 조각 1

class newMenuHandler가 ActionListener를 구현합니다
{
public void actionPerformed( ActionEvent ae )
{
textArea.setText( "" );
try
{ // 새 XTree 만들기
xTree = new XTree();
xTree.getSelectionModel().setSelectionMode(
HowsRootHandles ( true );
  // 추가 이 도구의 고급 버전으로 JTree
 xTree.setEditable( false );
 }
수정이 가능합니다.  catch( 예외 ex )
  {
   String message = ex.getMessage();
   ex.printStackTrace();
  }
  file://结束try/catch
 }
 file://结束actionPerformed()
}
file://结束class newMenuHandler
클래스 openMenuHandler는 ActionListener를 구현합니다
{
 JFileChooser jfc;
 Container parent;
int choice;
 openMenuHandler()
 {
  super();
  jfc = new JFileChooser();
  jfc.setSize( 400,300 );
  jfc.setFileFilter( new X ml파일필터( ) );
  parent = openItem.getParent(); }
  file://结束openMenuHandler()
  class openMenuHandler는 ActionListener를 구현합니다
  {
   JFileChooser jfc;
   Container parent;
   int 선택;

   openMenuHandler()
   {
    super();
    jfc = new JFileChooser();
    jfc.setSize( 400,300 );
    j fc.setFileFilter( new XmlFileFilter() );
 
parent = openItem.getParent();
   }
 public void actionPerformed( ActionEvent ae )
 {

  choice = jfc.showOpenDialog( parent );
 
  if( 선택 == JFileChooser.APPROVE_OPTION )
  {
   String fileName, line;
   BufferedReader reader;

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

   시도해보세요
   {
    reader = new BufferedReader(
    new FileReader( fileName ) );

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

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

   x트리. 새로 고침( textArea.getText() );
  }
  catch ( 예외 ex )
  {
   String message = ex.getMessage();
   ex.printStackTrace();
  }

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

 }
}
클래스 saveMenuHandler는 ActionListener를 구현합니다
 {
  JFileChooser jfc;
  컨테이너 부모;
  int 선택;

  saveMenuHandler()
  {
   super();
   jfc = new JFileChooser();
   jfc.setSize( 400,300 ) ;
jfc.setFileFilter (new xmlfileFilter ());
parent = saveItem.getParent ();
}
public void actionPerformed (ActionEvent ae)  
  choice = jfc.showSaveDialog( parent );

  if ( choice == JFileChooser.APPROVE_OPTION )
  {
   String fileName;
   파일 fO bj;
   FileWriter 작가 ;

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

   try
   {
    writer = new FileWriter( fileName );

    textArea.write ( 작가 );

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

 }
}

exitMenuHandler 클래스가 ActionListener를 구현합니다
{
 public void actionPerformed( ActionEvent ae )
 {
  verifyDialog.show();
 }
}
class XmlFileFilter는 javax.swing.filechooser.FileFilter를 확장합니다
{
 public boolean accept( File fobj )
 {
  if ( fobj.isDirectory() )
   return true;
  else
   return fobj.getName().endsWith( ".xml" );
  }

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


 以上就是使사용Java Swing 创建一个XML编辑器(三)的内容,更多相关内容请关注PHP中文网(www.php.cn)! 

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