Pytanie o kod

0

Cześć

Mam problem ze zrozumieniem fragmentu kodu zaznaczonego na czerwono:
Z góry dziex za pomoc

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.io.File;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
public class T1 {

public static void main(String[] args) {
JFrame f = new JFrame();
f.setSize(new Dimension(300,400));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JTree tree = new JTree();
FileTreeModel model = new FileTreeModel();

tree.setModel(model);
tree.addTreeWillExpandListener(model);
tree.setCellRenderer(new DefaultTreeCellRenderer(){
// renderer wyswietlajacy tylko nazwy plikow a nie pelne sciezki
public java.awt.Component
getTreeCellRendererComponent(JTree tree,Object value,boolean sel,boolean expanded,boolean leaf,int row,boolean hasFocus)
{
if (value instanceof DefaultMutableTreeNode &&
((DefaultMutableTreeNode) value).getUserObject() instanceof File) {
String name = ((File) ((DefaultMutableTreeNode)
value).getUserObject()).getName();
value = name.length() == 0 ? ((DefaultMutableTreeNode)
value).getUserObject() : name;
}
return super.getTreeCellRendererComponent(tree, value, sel, expanded,
false, row, hasFocus);
}

});

f.getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);

f.setVisible(true);
}

}

import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
import java.util.Comparator;

import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.ExpandVetoException;

public class FileTreeModel extends DefaultTreeModel implements
TreeWillExpandListener {
private static final long serialVersionUID = 3258410612462990384L;
/**

  • Pozwala sortowac pliki najpier katalogi, potem pliki i alfabetycznie.
  • Bardziej uniwersalne niz potrzeba, bo bylo pisane przed ograniczeniem
  • do katalogow
    /
    private static final Comparator<File> FILE_COMPARATOR = new Comparator<File>() {
    public int compare(File f1, File f2) {
    if (f1.isDirectory() && !f2.isDirectory()) return -1;
    if (!f1.isDirectory() && f2.isDirectory()) return 1;
    return f1.getName().toLowerCase().compareTo(f2.getName(). toLowerCase());
    }
    };
    /
    *
  • Wybiera tylko katalogi
    /
    private static final FileFilter FILE_FILTER = new FileFilter() {
    public boolean accept(File pathname) {
    return pathname.isDirectory();
    }
    };
    /
    *
  • Wczytanie pocztkowych potrzebnych danych
    /
    public FileTreeModel() {
    super(new DefaultMutableTreeNode("Komputer", true));
    DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) getRoot();
    for (File f : File.listRoots()) {
    DefaultMutableTreeNode node = new DefaultMutableTreeNode(f, true);
    rootNode.add(node);
    // zaglebienie sie o jeden dalej niz wyswietlenie. Dzieki
    // temu drzewo pozwala sie rozwijac
    addFile(node);
    }
    }
    /
    *
  • Dodanie kolejnych dzieci do drzewa
    */
    private void addFile(DefaultMutableTreeNode root) {
    // ale tylko wtedy gdy jeszcze nie jest wczytane, bo moze byc tak
    // ze juz jest i nie trzeba
    if (root.getUserObject() instanceof File && root.getChildCount() == 0) {
    File f = (File) root.getUserObject();
    if (f.isDirectory()) {
    File[] files = f.listFiles(FILE_FILTER);
    if(files != null){

for (File file : files) root.add(new DefaultMutableTreeNode(file,
true));
}
}
}
}
public void treeWillExpand(TreeExpansionEvent event) throws
ExpandVetoException {
// pobieramy node ktore ma byc rozwiniete
DefaultMutableTreeNode node = (DefaultMutableTreeNode)
event.getPath().getLastPathComponent();
// wczytujemy o jedno zaglebienie dalej niz bedzie rozwiniecie, czyli
// dla wszystkie dzieci rozwijanego dowiaduja sie co jest ponizej nich
for (int i = 0, n = node.getChildCount(); i < n; i++)
addFile((DefaultMutableTreeNode) node.getChildAt(i));
}
public void treeWillCollapse(TreeExpansionEvent event) throws
ExpandVetoException {
// nic nie robimy, zwalnianie pamieci nalezy robic nie tutaj, ale
// w TreeExpansionListener, juz po zwinieciu widoku
}
}

0

public java.awt.Component
getTreeCellRendererComponent(JTree tree,Object value,boolean sel,boolean expanded,boolean leaf,int row,boolean hasFocus)
{
if (value instanceof DefaultMutableTreeNode &&
((DefaultMutableTreeNode) value).getUserObject() instanceof File) {
String name = ((File) ((DefaultMutableTreeNode)
value).getUserObject()).getName();
value = name.length() == 0 ? ((DefaultMutableTreeNode)
value).getUserObject() : name;
}
return super.getTreeCellRendererComponent(tree, value, sel, expanded,
false, row, hasFocus);
}

Po 1 instanceof wykozystuje sie w celu sprawdzenia czy dany obiekt jest danej klasy.
Czyli u ciebie kod oznacza:
jesli obiekt value jest obiektem klasy DefaultMutableTreeNode
&& -> i (czyli gdy wiemy ze value jest klasy DefaultMutableTreeNode)
((DefaultMutableTreeNode) value).getUserObject() instanceof File)
^^^ Sprawdza czy ((DefaultMutableTreeNode) value).getUserObject() jest klasy File

Podam latwiejszy przyklad na instanceof:

String myString = "jakis tekst";
if(myString instanceof String)System.out.println("Obiekt klasy String");

1 użytkowników online, w tym zalogowanych: 0, gości: 1