2011-11-29 3 views
3

JFileChooser에서 구성 요소 (파일 형식)를 제거하려면 어떻게합니까? 라벨과 그 콤보 박스 모두?Java - JFileChooser에서 구성 요소 (파일 형식)를 제거하십시오.

JFileChooser fileChooser = new JFileChooser(); 
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
fileChooser.setDialogTitle("Select Folder"); 
fileChooser.setApproveButtonText("Select Folder"); 
fileChooser.setAcceptAllFileFilterUsed(false); 

hideComponents(fileChooser.getComponents()); 

private void hideComponents(Component[] components) { 

for (int i= 0; i < components.length; i++) { 
    if (components[i] instanceof JPanel) 
    hideComponents(((JPanel)components[i]).getComponents()); 
    else if (//component to remove)//what do I check for in here? 
    components[i].setVisible(false); 
} 

답변

3

정중하게 동의하지 않습니다. 거기에 이며, 특히 JFileChooser를 사용하여 항상 성공적으로 사용하며, 특히 DOS와 Mac 모두에서 저주받은 짐승을 만들 수 있습니다. 웹에는 수많은 예제가 있습니다. 제 작업 애플릿에서 추려낸 또 하나가 있습니다. 이 스 니펫은 모든 구성 요소의 배경색도 설정합니다.

짧은 설명 : 원본 포스터가 올바른 경로에 있었으므로 JFileChooser.getComponents()를 반복합니다. 그들은 구성 요소를 쉽게 식별 할 수 없으므로 텍스트 레이블을 찾고 원하는 조상을 얻습니다. 그런 다음 Container.getLayout(). remove (구성 요소)를 사용하여 레이아웃에서 제거하거나, 또는 Visible (false)을 설정하거나, 때때로 PreferredSize (새 치수 (0,0))를 설정하여 제거 할 수 있습니다.

// in wrapper: 
modifyJChooser(fileChooser.getComponents(), Color.white); 

// in component: 
private void modifyJChooser(Component[] jc, Color bg) { 

    for (int i = 0; i < jc.length; i++) { 
     Component c = jc[i]; 

     // hide file name selection 
     if (c.getClass().getSimpleName().equals("MetalFileChooserUI$3")) { 
      c.getParent().setVisible(false); 
     } 

     if (c instanceof JComboBox) { 
      Object sel = ((JComboBox) c).getSelectedItem(); 
      if (sel.toString().contains("AcceptAllFileFilter")) { 
       c.setVisible(false); 
      } 
     } else if (c instanceof JLabel) { 
    // **** This is the part that the original poster is looking for **** 
      String text = ((JLabel) c).getText(); 
      if (text.equals("Files of Type:") || text.equals("File Name:") || text.equals("Folder Name:")) { 
       c.getParent().getParent().remove(c.getParent()); 
      } 
     } else if (c instanceof JButton) { 
      JButton j = (JButton) c; 
      String txt = j.getText(); 
      if (txt != null) { 
       if (JCHOOSER_NEW_FOLDER.equalsIgnoreCase(txt)) { 
        j.getParent().setVisible(false); // Disable New Folder on Mac OS 
       } else if (JCHOOSER_BTN_CANCEL.equalsIgnoreCase(txt)) { 
        Component parent = c.getParent(); 
        ((Container) parent).remove(c); 
       } 
      } 
     } 

     if (c instanceof Container) 
      modifyJChooser(((Container) c).getComponents(), bg); 

     c.setBackground(bg); 
    } 

} 

주의 할이 제거 된 구성 요소를 한 번에 거주 간격을 조금 남긴다. 나는 그것의 근원을 확인할 수 없었다; 아무도 단서가 있다면 게시하십시오.

결과는 다음과 같습니다 (코드 스 니펫에 표시되지 않은 다른 수정 사항을 참고하십시오). enter image description here

+0

당신이 좋은 관행을 완전히 위반하고 있기 때문에 "나는 할 수있다.하지만 그렇게해서는 안된다"고 충고 할 것입니다. – DJClayworth

0

JFileChooser로는 그 구성 요소가 숨겨진하도록 설계되지 않았습니다 :

나는 다음과 같은 코드가 있습니다. 이 작업을 수행 할 API가 없습니다. 구성 요소는 비공개이므로 액세스 할 수 없으며 코드를 직접 숨길 수 없습니다.

아마 그렇게해서는 안됩니다. "모든 파일"필터를 설정하고 다른 필터는 설정하지 않아도 컨트롤을 비활성화 할 수 있습니다.이 경우 구성 요소는 관련성이 없어집니다.

기술적으로 Reflection을 사용하고 클래스 보호를 위반하면이 작업을 수행 할 수 있지만 앱에 절대적으로 중요하지 않는 한 그렇게하지 않는 것이 좋습니다.

+0

은 "모든 파일"필터를 설정하여 뜻 무엇 – jadrijan

+0

@DJClayworth, 나는 또한 사용자는 어쨌든 폴더를 선택할 수있는 컨트롤을 제거하고 싶었 대단히 감사하지만,이 경우 올바른 방법은 대신을 해제 괜찮을 것입니다 –

+0

"모든 파일"옵션 만 사용할 수 있도록 파일 필터를 설정하면 컨트롤이 아무런 효과가 없음을 의미합니다. – DJClayworth

관련 문제