2016-06-12 1 views
0

JFileChooser (JButton을 통해 시작)에서 파일을 선택하고 나중에 사용할 수 있도록 테이블에 문자열 경로를 저장할 수있는 인터페이스를 설계 중입니다. 파일 선택을위한 코드는 TheHandler 클래스에 포함되어 있고 테이블은 클래스 FilePanel 내에 있습니다. 나는 filePath의 값을 가지고 이 FilePanel인데, 테이블에 문자열을 저장할 수 있습니다.Java - JFileChooser가있는 테이블에 문자열 경로를 저장하고, set 메소드를 얻으시겠습니까?

내 문제는 그러나 그 tablePath 반환 내가 생각 null, 하나 이유는 사용자가 선택하기 전에

1) filePath는 값이 tablePath에 부여되는 void 방법

2)에 포함되어 파일

또는 1)과 2)의 조합. 그래서 내 질문에 filePath 값을 추출 할 수 있으므로 사용자가 파일을 선택한 후 tablePath 찍을 수 있습니다?

메소드를 얻고 설정하는 방법에 대해 생각하고 있습니다.하지만 방금 전에 만난 예제를 통해 actionPerformed(ActionEvent event) 생성자 내에서 사용해야한다고 생각 하겠지만, 그렇다면 그 일을하는 방법에 완전히 버려졌습니다. 어떤 도움이라도 대단히 감사하겠습니다.

TheHandler 클래스 :

public static class TheHandler implements ActionListener { 
    String filePath; 

    public void actionPerformed(ActionEvent event) { 
     Component parent = null; 
     JFileChooser chooser = new JFileChooser(); 
     FileNameExtensionFilter filter = new FileNameExtensionFilter("TIFF Images", "tif", "tiff"); 
     chooser.setFileFilter(filter); 
     int returnVal = chooser.showOpenDialog(parent); 

     filePath = chooser.getSelectedFile().toString(); 
     //System.out.println(filePath); 

     if (returnVal == JFileChooser.APPROVE_OPTION) { 
      ImagePlus picture = IJ.openImage(filePath); 
      picture.show(); 
     } 
    } 
} 

FilePanel 클래스 :

public class FilePanel extends JPanel { 
    public FilePanel() { 
     setLayout(new GridLayout(1, 0)); 
     TheHandler thePath = new TheHandler(); 
     String tablePath = thePath.filePath; 

     System.out.println(filePaths); // outputs null, this line runs before file is chosen? 

     String col[] = {"Loaded TIFF Files"}; 
     String[] tiffFiles = {filePaths, filePaths}; // Vector or list may be more useful? 
     DefaultTableModel tableModel = new DefaultTableModel(col, 0); 
     tableModel.addRow(tiffFiles); 
    } 
} 

답변

1

귀하의 TheHandler가하는 ActionListener 클래스 순수하고 단순하며, 주요 방법의 오버라이드 (override) actionPerformed 메소드 만 구성 요소가있는 경우라고 The Handler가 JButton, JMenuItem 또는 무엇이든간에 추가되어 호출되는 것을 트리거합니다. 이 클래스의 인스턴스를 만드는 것처럼 보입니다 만, ActionListeners를 사용하는 모든 구성 요소에 추가하는 것을 볼 수 없으므로 하나의 필드 filePath가 null로 유지되는 것은 놀랄 일이 아닙니다.

더 나은 방법으로 이것을 사용하려면 ActionListener가 사용되는 것으로 가정하십시오. JButton 또는 JMenuItem에 추가하고, 이벤트가 액션 수행을 지시 할 때 액션을 수행하게하십시오. filePath 필드가 null이 아닌 것을 통지 받고 싶은 경우는, SwingPropertyChangeSupport를 사용해 「바운드 프로퍼티」로 할 수 있습니다.

두 번째 옵션은 TheHandler의 actionPerformed에서 코드의 "고기"를 수행하는 메서드를 만드는 것입니다. 필요할 때 바로 호출하면됩니다. TheHandler가 이것을 호출하여 이중 목적을 제공 할 수도 있습니다.

예를 들어,

public static class TheHandler implements ActionListener{ 
    String filePath;   

    public void actionPerformed(ActionEvent event){    
     String innerPath = null; 
     innerPath = getFilePath(); 
     if (innerPath != null) { 
      filePath = innerPath; 
      ImagePlus picture = IJ.openImage(filePath); 
      picture.show();                    
     }    
    } 

    public String getFilePath() { 
     String innerFilePath = null; 
     Component parent = null; // better to avoid this 
     JFileChooser chooser = new JFileChooser(); 
     FileNameExtensionFilter filter = new FileNameExtensionFilter("TIFF Images", "tif","tiff"); 
     chooser.setFileFilter(filter);  
     int returnVal = chooser.showOpenDialog(parent); 
     if(returnVal == JFileChooser.APPROVE_OPTION) { 
      innerFilePath = chooser.getSelectedFile().toString();            
     } 
     return innerFilePath; 
    } 
} 

그런 다음 다른 클래스는 직접 TheHandler의 getFilePath() 메소드를 호출 할 수있다.

+0

아, 사과 하긴하지만, 내 게시물에는 남지 않았습니다.하지만 ActionBener는 JButton과 결합되어 addBtn 프로세스를 시작합니다.addActionListener (new TheHandler()); 이것은 의미가 있지만, 내가이 일을 진짜 빨리 할 수 ​​있는지 알게 해달라고하자. – Rosie

+0

아하. 내가 틀렸다면 나에게 맞지만, innerPath 자체는 호출 될 수 없지만, getFilePath() 메소드를 생성하면 innerPath는 innerFilePath의 값을 취한다. 조건은 충족되며 getFilePath()는 innerFilePath를 반환하는 공용 메서드이므로 다른 클래스에서 해당 메서드를 호출 할 수 있습니다. – Rosie

+0

사실, 괜찮다면 다른 질문이 있습니다. 생성 한 메서드는 void 메서드에서 원하는 파일 경로를 가져 오는 파일 선택기를 꺼내었지만 다른 클래스에서 해당 메서드를 호출하면 두 번째 파일 선택기가 열립니다 (로드 단추를 누를 때 첫 번째 파일 선택기가 열립니다). getFilePath() 메서드의 반환 값을 얻을 수있는 방법이 있나요? 그래서 다른 클래스에서 결과 문자열 값을 사용할 수 있습니까? – Rosie

관련 문제