내 사용 사례는 다음과 같습니다. 열 때마다 새로 고쳐지는 디렉터리에서 필터링 된 파일 목록을 표시하는 콤보 상자를 원합니다. 또한 콤보 상자에 표시된 문자열이 디렉터리 나 확장명이없는 파일 이름이되기를 원합니다 (사용자에게 노출하고 싶지 않은 구현 세부 정보 임).
ComboBoxModel
다음과 같이 구현했습니다 .
public class XMLComboModel extends DefaultComboBoxModel<Path> implements PopupMenuListener {
public static final String EXT = ".xml";
private final Path directory;
public XMLComboModel(String pathName) {
this.directory = Paths.get(pathName);
populateModel();
}
public Path getSelectedPath() {
return (Path) getSelectedItem();
}
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
populateModel();
}
private void populateModel() {
removeAllElements();
try {
Files.newDirectoryStream(directory, "*" + EXT).forEach(this::addElement);
if (getSelectedPath() != null) {
for (int i = 0; i < getSize(); i++) {
if (getElementAt(i).compareTo(getSelectedPath()) == 0)
setSelectedItem(getElementAt(i));
}
}
} catch (IOException ex) {
LOG.log(Level.SEVERE, null, ex);
}
}
PopupMenuListener
명확성 을 위해 몇 가지 방법 을 생략했습니다.
이것은 내가 원하는 것이 아닌 콤보 상자에 전체 경로를 표시한다는 점을 제외하고는 잘 작동합니다. 경로 표시를 조정하는 가장 간단한 방법은 Renderer를 사용자 정의하는 것이라고 생각했습니다. 나는 이것을 시도했다.
comboBox.setRenderer(new BasicComboBoxRenderer() {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
Path path = (Path) value;
String fileName = path.getFileName().toString().replace(EXT, "");
Component component = super.getListCellRendererComponent(list, fileName, index,
isSelected, cellHasFocus);
return component;
}
});
불행히도 이것은 작동하지 않습니다. 그것은 호출 올바르게 잘린 파일 이름을 표시하지만, setSelectedItem
함께 String
보다는 Path
의미가 있지만 모델의 경로와 일치하지 것이다 -.
내 옵션은 다음과 같습니다.
BasicComboBoxRenderer
레이블의 텍스트를 제외하고 기능을 복제하는 나만의 사용자 정의 구성 요소를 작성 하십시오.setSelectedItem
모델에서 재정 의하여 주어진 파일 이름을 가진 경로를 찾습니다.두 번째는 구현하기가 더 간단합니다.
@Override
public void setSelectedItem(Object item) {
for (int i = 0; i < getSize(); i++) {
if (super.getElementAt(i).equals(Paths.get(item.toString()))) {
super.setSelectedItem(super.getElementAt(i));
return;
}
}
}
그러나 이것은 내가 Path
모델에서 통과 한 것을 감안할 때 꽤 투박한 것처럼 보입니다 Path
. 이것을 달성하는 더 간단한 방법을 놓치고 있습니까?
하지만 이제는 경로가 아닌 문자열로 setSelectedItem을 호출합니다.
렌더러는 콤보 상자 모델의 다른 방법과 관련이 없습니다.
메서드에 Path
객체 를 전달 하려면 모델이 적절한 .NET Framework를 선택할 수 있도록 객체가 메서드를 구현 setSelectedItem(...)
하는지 확인해야합니다 .Path
equals(...)
Path
그런 다음 사용자 지정 렌더러를 만들어 표시 Path
하려는 개체 의 모든 부분 을 표시합니다.
경로를 되 찾는 것이 좋을 것입니다.
모델에 Path 개체가 포함 된 경우 getSelectedItem()
메서드는 Path 개체를 반환합니다. 경로로 캐스트하거나 getSelectedPath()
방법을 사용해야합니다 .
따라서 DefaultComboBoxModel의 메서드를 재정의 할 필요가 없으며 메서드 만 추가하면 getSelectedPath()
됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다