r9
Nybegynder
17. marts 2003 - 22:39
Der er
20 kommentarer og 1 løsning
Java shell-tree komponent?
Findes der en java "shell-tree" GUI komponent? Jeg skal bruge en GUI komponent som kan vise det underliggende filsystem. (Windows Explorer-like view ) Jeg skal altså bruge en komponent som jeg kan smide på min frame, og vha. den, navigerer det underliggende filsystem. Desuden skal man kunne åbne de filer som man ser på disken. Hvis det f.eks er et word doc, så skal filen åbnes af det program som er tilknyttet den filtype. Dvs. at komponenten faktisk bare skal være "et dumt interface" til filsystemet. Findes det?
Annonceindlæg fra Academic Work Denmark A/S
r9
Nybegynder
17. marts 2003 - 22:48
#1
Hvis der kun findes en windows specifik komponent, så vil jeg også gerne høre om det.
r9
Nybegynder
17. marts 2003 - 23:16
#2
noget ala JFileChooser
17. marts 2003 - 23:26
#3
Giv mig lige 30min
r9
Nybegynder
17. marts 2003 - 23:37
#4
oki
17. marts 2003 - 23:56
#5
Ok.. her er en letvægtsløsning jeg lige har klasket sammen. Du kan navigere enten med træet til højre eller med tabellen til venstre.. eller begge! Valget i træet opdaterer tabellen, men valget i tabellen opdaterer endnu ikke træet.. det vil jeg lige prøve at implementere. Du kan køre filer fra tabellen ved at dobbeltklikke på dem. Dobbeltklik på mapper åbner blot mappen. Det virker endnu ikke 100% med åbning af filer.. der er nogle slags den ikke vil åbne. Men .exe, .com, .bat og andre er understøttet. // TestFrame.java: import javax.swing.*; import javax.swing.tree.*; import java.awt.event.*; import java.awt.*; import java.io.*; public class TestFrame extends JFrame { private FileTreeModel treeModel; private JTree tree; private FileTableModel tableModel; private JTable table; public TestFrame() { super("Test"); setSize(600,300); File root = new File("C:/"); treeModel = new FileTreeModel(root); tree = new JTree(treeModel); tree.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { int x = event.getX(); int y = event.getY(); int selRow = tree.getRowForLocation(x, y); if(selRow != -1) { File file = (File)tree.getLastSelectedPathComponent(); tableModel.setRoot(file); } } }); tableModel = new FileTableModel(root); table = new JTable(tableModel); table.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { if( event.getClickCount() == 2 ) { int row = table.getSelectedRow(); if( row == 0 ) { // gå tilbage File root = tableModel.getRoot(); if( root.getParentFile() != null ) tableModel.setRoot(root.getParentFile()); } else { File file = tableModel.getFile(row); if( file.isDirectory() ) tableModel.setRoot(file); else run(file); } } } }); JSplitPane split = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(tree), new JScrollPane(table) ); split.setContinuousLayout(true); split.setDividerLocation(200); getContentPane().add(split, BorderLayout.CENTER); } private void run(File file) { try { System.out.println ("Running: "+file.getAbsolutePath()); String name = file.getName(); if( name.endsWith(".exe") || name.endsWith(".com") || name.endsWith(".bat") ) Runtime.getRuntime().exec(file.getAbsolutePath()); else Runtime.getRuntime().exec("cmd.exe /c "+file.getAbsolutePath()); } catch(IOException ioe) { ioe.printStackTrace(); } } } class Go { public static void main(String[] args) { new TestFrame().show(); } } // FileTreeModel.java: import javax.swing.tree.*; import javax.swing.event.TreeModelListener; import java.io.File; import java.io.FileFilter; public class FileTreeModel implements TreeModel { private File root; public FileTreeModel(File root) { this.root = root; } private File[] list(File file) { return file.listFiles(new DirFilter()); } public Object getChild(Object parent, int index) { return list((File)parent)[index]; } public int getChildCount(Object parent) { return list((File)parent).length; } public int getIndexOfChild(Object parent, Object child) { File[] files = list((File)parent); for( int i = 0; i < files.length; i++ ) { if( files[i] == child ) { return i; } } return -1; } public Object getRoot() { return root; } public boolean isLeaf(Object node) { return false; } public void addTreeModelListener(TreeModelListener l) {} public void removeTreeModelListener(TreeModelListener l) {} public void valueForPathChanged(TreePath path, Object newValue) {} private class DirFilter implements FileFilter { public boolean accept(File file) { return file.isDirectory() && !file.isHidden(); } } } // FileTableModel.java: import javax.swing.table.AbstractTableModel; import java.io.File; public class FileTableModel extends AbstractTableModel { private String[] columns = { "Filnavn", "Størrelse", "Type" }; private File root; private String goBack = "Tilbage..."; public FileTableModel(File root) { this.root = root; } private File[] list() { return root.listFiles(); } public int getColumnCount() { return columns.length; } public int getRowCount() { return (list().length+1); } public String getColumnName(int column) { return columns[column]; } public Object getValueAt(int row, int column) { if( row == 0 ) { if( column == 0 ) return goBack; else return ""; } if( column == 0 ) { return list()[row-1].getName(); } else if( column == 1 ) { return new Long(list()[row-1].length()); } else if( column == 2 ) { if( list()[row-1].isDirectory() ) return "Directory"; else return "File"; } return null; } public Class getColumnClass(int column) { return getValueAt(0, column).getClass(); } public boolean isCellEditable(int row, int column) { return false; } public void setValueAt(Object value, int row, int column) { switch( column ) { case 0: { // nada } break; case 1: { // nada } break; case 2: { // nada } break; } fireTableCellUpdated(row, column); } public File getFile(int row) { return list()[row-1]; } public void setRoot(File root) { fireTableRowsDeleted(0, list().length); this.root = root; } public File getRoot() { return root; } }
17. marts 2003 - 23:57
#6
Mit svar kommer faktisk 30min og 15 sekunder efter :) 15 sekunder over deadline, hvilket må skyldes lag på eksperten :)
18. marts 2003 - 00:54
#7
Her er en lidt federe løsning, hvor jeg har flyttet ansvaret for opdatering af børn ud på noderne.. det er lidt mere fleksibelt. // TestFrame.java: import javax.swing.*; import javax.swing.tree.*; import javax.swing.event.*; import java.awt.event.*; import java.awt.*; import java.io.*; public class TestFrame extends JFrame { private DefaultTreeModel treeModel; private JTree tree; private FileTableModel tableModel; private JTable table; public TestFrame() { super("Test"); setSize(600,300); File root = new File("C:/"); FileNode rootNode = new FileNode(root); rootNode.explore(); treeModel = new DefaultTreeModel(rootNode); tree = new JTree(treeModel); tree.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { int x = event.getX(); int y = event.getY(); int selRow = tree.getRowForLocation(x, y); if(selRow != -1) { FileNode node = (FileNode)tree.getLastSelectedPathComponent(); tableModel.setRoot(node.getFile()); } } }); tree.addTreeWillExpandListener(new TreeWillExpandListener() { public void treeWillExpand(TreeExpansionEvent e) throws ExpandVetoException { FileNode node = (FileNode)e.getPath().getLastPathComponent(); node.explore(); } public void treeWillCollapse(TreeExpansionEvent e) { } }); tableModel = new FileTableModel(root); table = new JTable(tableModel); table.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { if( event.getClickCount() == 2 ) { int row = table.getSelectedRow(); if( row == 0 ) { // gå tilbage File root = tableModel.getRoot(); if( root.getParentFile() != null ) tableModel.setRoot(root.getParentFile()); } else { File file = tableModel.getFile(row); if( file.isDirectory() ) tableModel.setRoot(file); else run(file); } } } }); JSplitPane split = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(tree), new JScrollPane(table) ); split.setContinuousLayout(true); split.setDividerLocation(200); getContentPane().add(split, BorderLayout.CENTER); } private void run(File file) { try { System.out.println ("Running: "+file.getAbsolutePath()); String name = file.getName(); if( name.endsWith(".exe") || name.endsWith(".com") || name.endsWith(".bat") ) Runtime.getRuntime().exec(file.getAbsolutePath()); else Runtime.getRuntime().exec("cmd.exe /c "+file.getAbsolutePath()); } catch(IOException ioe) { ioe.printStackTrace(); } } } class Go { public static void main(String[] args) { new TestFrame().show(); } } // FileNode.java: import javax.swing.*; import javax.swing.tree.*; import javax.swing.event.*; import java.awt.event.*; import java.awt.*; import java.io.*; public class TestFrame extends JFrame { private DefaultTreeModel treeModel; private JTree tree; private FileTableModel tableModel; private JTable table; public TestFrame() { super("Test"); setSize(600,300); File root = new File("C:/"); FileNode rootNode = new FileNode(root); rootNode.explore(); treeModel = new DefaultTreeModel(rootNode); tree = new JTree(treeModel); tree.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { int x = event.getX(); int y = event.getY(); int selRow = tree.getRowForLocation(x, y); if(selRow != -1) { FileNode node = (FileNode)tree.getLastSelectedPathComponent(); tableModel.setRoot(node.getFile()); } } }); tree.addTreeWillExpandListener(new TreeWillExpandListener() { public void treeWillExpand(TreeExpansionEvent e) throws ExpandVetoException { FileNode node = (FileNode)e.getPath().getLastPathComponent(); node.explore(); } public void treeWillCollapse(TreeExpansionEvent e) { } }); tableModel = new FileTableModel(root); table = new JTable(tableModel); table.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { if( event.getClickCount() == 2 ) { int row = table.getSelectedRow(); if( row == 0 ) { // gå tilbage File root = tableModel.getRoot(); if( root.getParentFile() != null ) tableModel.setRoot(root.getParentFile()); } else { File file = tableModel.getFile(row); if( file.isDirectory() ) tableModel.setRoot(file); else run(file); } } } }); JSplitPane split = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(tree), new JScrollPane(table) ); split.setContinuousLayout(true); split.setDividerLocation(200); getContentPane().add(split, BorderLayout.CENTER); } private void run(File file) { try { System.out.println ("Running: "+file.getAbsolutePath()); String name = file.getName(); if( name.endsWith(".exe") || name.endsWith(".com") || name.endsWith(".bat") ) Runtime.getRuntime().exec(file.getAbsolutePath()); else Runtime.getRuntime().exec("cmd.exe /c "+file.getAbsolutePath()); } catch(IOException ioe) { ioe.printStackTrace(); } } } class Go { public static void main(String[] args) { new TestFrame().show(); } } // FileTableModel.java: import javax.swing.table.AbstractTableModel; import java.io.File; public class FileTableModel extends AbstractTableModel { private String[] columns = { "Filnavn", "Størrelse", "Type" }; private File root; private String goBack = "Tilbage..."; public FileTableModel(File root) { this.root = root; } private File[] list() { return root.listFiles(); } public int getColumnCount() { return columns.length; } public int getRowCount() { return (list().length+1); } public String getColumnName(int column) { return columns[column]; } public Object getValueAt(int row, int column) { if( row == 0 ) { if( column == 0 ) return goBack; else return ""; } if( column == 0 ) { return list()[row-1].getName(); } else if( column == 1 ) { return new Long(list()[row-1].length()); } else if( column == 2 ) { if( list()[row-1].isDirectory() ) return "Directory"; else return "File"; } return null; } public Class getColumnClass(int column) { return getValueAt(0, column).getClass(); } public boolean isCellEditable(int row, int column) { return false; } public void setValueAt(Object value, int row, int column) { switch( column ) { case 0: { // nada } break; case 1: { // nada } break; case 2: { // nada } break; } fireTableCellUpdated(row, column); } public File getFile(int row) { return list()[row-1]; } public void setRoot(File root) { fireTableRowsDeleted(0, list().length); this.root = root; } public File getRoot() { return root; } }
18. marts 2003 - 00:55
#8
ups, missede lige en paste der. // FileNode.java: import javax.swing.tree.DefaultMutableTreeNode; import java.io.*; public class FileNode extends DefaultMutableTreeNode { private File file; public FileNode(File file) { this.file = file; } public boolean getAllowsChildren() { return file.isDirectory(); } public boolean isLeaf() { return file.listFiles().length == 0; } public File getFile() { return file; } public boolean isDirectory() { return file.isDirectory(); } public String toString() { if( file.getName().equals("") ) return file.getAbsolutePath(); return file.getName(); } public void explore() { File[] children = file.listFiles(new DirFilter()); for(int i=0; i < children.length; ++i) add(new FileNode(children[i])); } private class DirFilter implements FileFilter { public boolean accept(File file) { return file.isDirectory() && !file.isHidden(); } } }
r9
Nybegynder
18. marts 2003 - 09:15
#9
viht: Jeg afprøver det lige senere i dag.
18. marts 2003 - 09:15
#10
Det er i orden. Jeg arbejder lidt videre på det senere. Skal lige have træet til at følge med tabellen.
18. marts 2003 - 12:09
#11
Jeg har netop implementeret en bedre træstruktur. Træet folder automatisk ud når du markerer en node, og det følger ydermere med tabellens valg af filer. Det begynder efterhånden at ligne Explorer rimelig meget :) Interesseret?
r9
Nybegynder
18. marts 2003 - 15:05
#12
ja, meget gerne.
18. marts 2003 - 18:48
#13
Så, nu er det efterhånden ved at sparke røv. Jeg har erstattet tabellen med en JList, og det virker meget bedre. Listen bliver sorteret med directories først, så filer. Listens valg reflekteres i træet og omvendt, og jeg har endda fået ikoner på den. // TestFrame.java: import javax.swing.*; import javax.swing.tree.*; import javax.swing.event.*; import java.awt.event.*; import java.awt.*; import java.io.*; public class TestFrame extends JFrame { private FileListModel listModel; private JList fileList; private DefaultTreeModel treeModel; private FileTree tree; public TestFrame() { super("Test"); setSize(600,300); JToolBar bar = new JToolBar(); bar.setLayout(new FlowLayout(FlowLayout.RIGHT)); final JButton goBackButton = new JButton("Tilbage"); goBackButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { File file = listModel.getRoot(); File parent; if( (parent = file.getParentFile()) != null ) { tree.goBack(); listModel.setFile(parent); } } }); bar.add(goBackButton); getContentPane().add(bar, BorderLayout.NORTH); File root = new File("C:/"); FileNode rootNode = new FileNode(root); rootNode.explore(); treeModel = new DefaultTreeModel(rootNode); tree = new FileTree(treeModel); tree.setSelectionPath( new TreePath(((FileNode)treeModel.getRoot()).getPath()) ); tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { FileNode node = (FileNode)tree.getLastSelectedPathComponent(); if( node != null ) { tree.expandPath(node); listModel.setFile(node.getFile()); } } }); tree.addTreeWillExpandListener(new TreeWillExpandListener() { public void treeWillExpand(TreeExpansionEvent e) throws ExpandVetoException { FileNode node = (FileNode)e.getPath().getLastPathComponent(); node.explore(); } public void treeWillCollapse(TreeExpansionEvent e) { } }); listModel = new FileListModel(root); fileList = new JList(listModel); fileList.setCellRenderer(new FileListRenderer()); fileList.setLayoutOrientation(JList.VERTICAL_WRAP); fileList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fileList.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { if( event.getClickCount() == 2 ) { File file = listModel.getFile(fileList.getSelectedIndex()); if( file.isDirectory() ) { listModel.setFile(file); tree.explore(file); } else run(file); } } }); JSplitPane split = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(tree), new JScrollPane(fileList) ); split.setContinuousLayout(true); split.setDividerLocation(200); getContentPane().add(split, BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void run(File file) { try { System.out.println ("Running: "+file.getAbsolutePath()); String name = file.getName(); if( name.endsWith(".exe") || name.endsWith(".com") || name.endsWith(".bat") ) Runtime.getRuntime().exec(file.getAbsolutePath()); else Runtime.getRuntime().exec("cmd.exe /c "+file.getAbsolutePath()); } catch(IOException ioe) { ioe.printStackTrace(); } } private class FileListRenderer extends DefaultListCellRenderer { private JFileChooser chooser; public FileListRenderer() { chooser = new JFileChooser(); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) { JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, hasFocus); File file = listModel.getFile(index); label.setIcon(chooser.getIcon(file)); return label; } } } class Go { public static void main(String[] args) { new TestFrame().show(); } } // FileNode.java: import javax.swing.tree.DefaultMutableTreeNode; import java.io.*; public class FileNode extends DefaultMutableTreeNode { private File file; public FileNode(File file) { this.file = file; } public boolean getAllowsChildren() { return file.isDirectory(); } public boolean isLeaf() { return file.listFiles().length == 0; } public File getFile() { return file; } public boolean isDirectory() { return file.isDirectory(); } public String toString() { if( file.getName().equals("") ) return file.getAbsolutePath(); return file.getName(); } public void explore() { File[] children = file.listFiles(new DirFilter()); for(int i=0; i < children.length; ++i) add(new FileNode(children[i])); } private class DirFilter implements FileFilter { public boolean accept(File file) { return file.isDirectory() && !file.isHidden(); } } } // FileListModel.java: import javax.swing.*; import javax.swing.event.*; import java.io.*; import java.util.*; public class FileListModel extends DefaultListModel { private File file; private File[] fileList; public FileListModel(File file) { this.file = file; setFileList(file); } public File getFile(int index) { return list()[index]; } public File getRoot() { return file; } public void setFile(File file) { this.file = file; setFileList(file); super.fireContentsChanged(this, 0, list().length); } private File[] list() { return fileList; } private class HiddenFilter implements FileFilter { public boolean accept(File file) { return !file.isHidden(); } } private void setFileList(File file) { TreeSet dirSet = new TreeSet(); TreeSet fileSet = new TreeSet(); File[] files = file.listFiles(new HiddenFilter()); for( int i = 0; i < files.length; i++ ) { if( files[i].isDirectory() ) dirSet.add(files[i]); else fileSet.add(files[i]); } int len = files.length; fileList = new File[len]; Iterator dirIt = dirSet.iterator(); Iterator fileIt = fileSet.iterator(); int i = 0; while( dirIt.hasNext() ) { fileList[i] = (File)dirIt.next(); i++; } while( fileIt.hasNext() ) { fileList[i] = (File)fileIt.next(); i++; } } public int getSize() { return list().length; } public Object getElementAt(int n) { return list()[n].getName(); } } // FileTree.java: import javax.swing.tree.*; import javax.swing.*; import java.io.File; public class FileTree extends JTree { public FileTree(TreeModel model) { super(model); } public void explore(File file) { FileNode node = (FileNode)getLastSelectedPathComponent(); int count = node.getChildCount(); for( int i = 0; i < count; i++ ) { FileNode fileNode = (FileNode)node.getChildAt(i); if( fileNode.getFile().getAbsolutePath().equals(file.getAbsolutePath()) ) { expandPath(fileNode); setSelectionPath(new TreePath(fileNode.getPath())); break; } } } public void goBack() { FileNode selected = (FileNode)getLastSelectedPathComponent(); FileNode parent = (FileNode)selected.getParent(); if( parent != null ) { setSelectionPath( new TreePath(parent.getPath()) ); collapsePath(new TreePath(selected.getPath()) ); } } public void expandPath(FileNode node) { TreePath path = new TreePath(node.getPath()); expandPath(path); setSelectionPath(path); } }
r9
Nybegynder
18. marts 2003 - 21:55
#14
nu ser det sku godt ud. Men hvordan får jeg programmet til at åbne .txt og .doc ved dobbeltklik? Kun .html virker
r9
Nybegynder
18. marts 2003 - 22:01
#15
viht: Jeg har lige tjekket .txt, .pdf, .doc, .html. De virker alle, hvis der ikke er mellemrum i filnavnet! Hvad gør vi, hvis filerne skal åbnes, selvom der er mellemrum i filnavnet?
r9
Nybegynder
18. marts 2003 - 22:20
#16
nu virker det: Runtime.getRuntime().exec("cmd.exe /c " + "\"" + file.getAbsolutePath() + "\"" ); Det skulle bare "" omkring.
18. marts 2003 - 23:32
#17
Alright.. cool! Det tilføjer jeg lige.
19. marts 2003 - 00:25
#18
I øvrigt bør du lige ændre følgende i FileNode.java: public boolean isLeaf() { File[] subs = file.listFiles(new DirFilter()); if( subs.length == 0 ) return true; return false; }
r9
Nybegynder
19. marts 2003 - 09:11
#19
viht: Lige en sidste ting inden jeg lukker. Hvis jeg nu har en vector som indeholder en række filnavne, og ønsker at vise netop de filer som er i vectoren. Hvordan gør jeg så det? Filerne skal vises i en tabel(ligesom du har gjort), så man kan klikke på dem, og derved åbne dem.
19. marts 2003 - 10:02
#20
Så vil jeg anbefale du bruger den TableModel jeg brugte før jeg lavede det om til en JList. Den arbejder på en File. F.eks. File file = new File("C:/"); FileTableModel model = new FileTableModel(file); JTable table = new JTable(model); table.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { if( event.getClickCount() == 2 ) { File selected = model.getFile(table.getSelectedRow()); } } });
r9
Nybegynder
19. marts 2003 - 18:25
#21
jeg takker for god hjælp.
Kurser inden for grundlæggende programmering