0
TreeView를 다루는 데 많은 어려움을 겪고 있습니다. 노드 당 표시되는 텍스트가 더 구체적입니다.TreeView 노드 이름 도청
private void defineEmpityTree(){
cbt.setModel(new DefaultTreeModel(
new DefaultMutableTreeNode("Relat\u00F3rios Individuais") {
{
}
}
));
}
나는 트리를 초기화 추가 : 나는 텍스트가 하나의 노드를 예상 트리에 대한 초기화를 시작으로
, 그것은 사용자를위한 프로그램을보다 직관적으로 만들 수도
"Relatórios Individuais" aren't shown, Tree Ok, another bug
cbt = new JCheckBoxTree();
defineEmpityTree();
scrollPane.setViewportView(cbt);
내가이 문제를 무시하고, 노드의 실제 작성을 계속, 사용자가 자신의 검색 및 눌러 지정 "확인" , 우리가 나무를 가득 채울 때, 두 번째 이미지.
그러나 또 다른 이상한 문제가 발생합니다. "확인"을 다시 누르면 일부 텍스트가 이상한 세 번째 이미지로 이동합니다.
노드가 생성 된 케 이드의 부분을 강조합니다. 파일 배열의 경우 각 유형의 보고서와 각 보고서의 로트에 대해 노드가 작성됩니다. 실제로는별로 중요하지 않습니다.
cbt.setModel(myTree);
올바른 방법은 트리의 내용을 정의 할 수 있다는 것입니다
private void defineNewTree(ArrayList<File> files){
DefaultMutableTreeNode dmtRoot = new DefaultMutableTreeNode("Relat\u00F3rios Individuais");
DefaultMutableTreeNode dmtSubFolder = null;
DefaultMutableTreeNode dmtLotFolder = null;
int childsRoot = 0;
int childsSub = 0;
for(File f : files){
String subFolder = f.getName().substring(17,f.getName().length()-4);
String name = f.getName();
String lot = f.getName().substring(0, 3);
childsRoot = dmtRoot.getChildCount();
boolean subFoldExists = false;
boolean foldLotExists = false;
//creatingo folder reports:
for(int i = 0;i<childsRoot;i++){
if(dmtRoot.getChildAt(i).toString().equals(subFolder)){
dmtSubFolder = (DefaultMutableTreeNode) dmtRoot.getChildAt(i);
subFoldExists = true;
i=childsRoot;
}
}
if(!subFoldExists){
dmtSubFolder = new DefaultMutableTreeNode(subFolder);
dmtRoot.add(dmtSubFolder);
}
for(int j = 0;j<childsSub;j++){
if(dmtSubFolder.getChildAt(j).toString().equals(lot)){
dmtLotFolder = (DefaultMutableTreeNode) dmtSubFolder.getChildAt(j);
foldLotExists = true;
j=childsSub;
}
}
if(!foldLotExists){
dmtLotFolder = new DefaultMutableTreeNode("lote "+lot);
dmtSubFolder.add(dmtLotFolder);
}
dmtLotFolder.add(new DefaultMutableTreeNode(name));
}
DefaultTreeModel myTree = new DefaultTreeModel(dmtRoot);
cbt.setModel(myTree);
}
나는 진짜 문제가 있다고 생각?
편집 : 버튼 확인 :
...
JButton btnOk = new JButton("OK");
btnOk.setBounds(161, 37, 49, 23);
btnOk.setActionCommand("ok");
btnOk.addActionListener(buttonListener);
panel.add(btnOk);
...
class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent a) {
switch(a.getActionCommand()){
case "ok":
search();
self.requestFocusInWindow();
break;
case "cancel":
dispose();
break;
case "print":
TreePath[] tp = cbt.getCheckedPaths();
for(TreePath t : tp){
System.out.println(t.getLastPathComponent().toString());
}
self.requestFocusInWindow();
break;
default:
break;
}
}
}
private void search(){
FileSeeker fs = new FileSeeker(textField.getText());
ArrayList<File> files = fs.getFiles();
defineNewTree(files);
}
편집 : CheckBoxCellRenderer :
private class CheckBoxCellRenderer extends JPanel implements TreeCellRenderer {
private static final long serialVersionUID = -7341833835878991719L;
JCheckBox checkBox;
public CheckBoxCellRenderer() {
super();
this.setLayout(new BorderLayout());
checkBox = new JCheckBox();
add(checkBox, BorderLayout.CENTER);
setOpaque(false);
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
Object obj = node.getUserObject();
TreePath tp = new TreePath(node.getPath());
CheckedNode cn = nodesCheckingState.get(tp);
if (cn == null) {
return this;
}
checkBox.setSelected(cn.isSelected);
checkBox.setText(obj.toString());
checkBox.setOpaque(cn.isSelected && cn.hasChildren && ! cn.allChildrenSelected);
return this;
}
}
여기에 확인 버튼 뒤에 코드가 표시 되었습니까? 나는 그것을 볼 수 없다. – Michael
문제가 아니라고 생각해서 표시하지 않았습니다. 지금 추가하겠습니다 : D –
문제는 트리 셀 렌더러에 있다고 생각됩니다. 이 의심은 null 레이아웃을 사용하면 더욱 커집니다. 각 JCheckBox의 크기를 명시 적으로 설정하면 표시되는 동작을 설명합니다. 트리의 셀 렌더러를 설정하는 코드를 포함하십시오. – VGR