in listFiles() oder JList Dateiendungen entfernen

Ingerten

Bekanntes Mitglied
Hallo Männers,

ich würde gerne aus listFiles() oder JList die Dateiendung .lnk verschwinden lassen, bevor ich die Dateinamen ausgebe, aber irgendwie will es mir nicht gelingen.

Kennt da jemand einen Supergeheimen ansatz, wie ich das Problem lösen kann? ???:L
 
super geheim und nicht weitersagen...

Java:
File dir = new File("/users/blah/dirname");
File[] files = dir.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
});

1. Google Treffer, der hier gibt dir nur .txt´s wieder...wie du evtl. alle außer .lnk wiedergeben kannst, überlass ich mal deiner Intelligenz! Sollte das hier einer sagen, muss ich leider ....
 
Ich glaube wir meinen nicht ganz das selbe, denke ich mal.
Ich wollte nicht, das er mir die Dateien mit einem .lnk am Ende nicht ausgibt, sondern ich will ja genau die Dateien, mit dem .lnk am Ende, nur will ich die Endung nicht mit ausgeben lassen

also die Kurzform:

meine ausgabe sieht im moment so aus

link1.lnk
link2.lnk
link3.lnk


ich will aber

link1
link2
link3

also ohne Dateiendung
 
Willst du die Dateien nach Dateiendung filtern oder geht es dir darum das die Ausgabe in der JList einfach ohne Dateiendung dasteht?

Fürs filtern hat dir jgh schon eine Lösung gegeben.

Wenn es dir um die Anzeige geht musst du beim Hinzufügen der Dateinamen zur JList einfach die "String.substring(...)" Methode verwenden.

EDIT: Also es geht um die Anzeige, wie fügst du denn die Daten zu deiner JList hinzu?
 
Zuletzt bearbeitet:
Java:
for (int s = 0; s < file.length; s++) 
{
File userHome = new File(file[s]);
File[] files2 = userHome.listFiles();

list[s] = new JList(files2);
list[s].setFixedCellHeight(App.wert_hoeheDerZelleInDemDerLinkSteht); // Höhe der Zelle
list[s].setCellRenderer(new FileListCellRenderer());
list[s].setBounds(startPunpt_x, 30, breite, framehoehe - 119);

scrollPane[s].setViewportView(list[s]);
}
 
Das Problem liegt am "FileListCellRenderer".

Diese Klasse wird als CellRenderer der JList gesetzt. Der CellRenderer kann die Anzeige eines Eintrages in der JList "aufpeppen".
Wenn diese Klasse nicht deine eigene ist, wird es dir damit nicht möglich sein die Anzeige zu ändern. Entweder schreibst du deinen eigenen CellRenderer (Beispiel: eigener CellRenderer) oder informierst dich ob du den verwendeten CellRenderer "konfigurierern" kannst.
 
#Joose, besten Dank für deine Hilfe.

Ich glaube, ich werde es mal mit dem "eigenen CellRenderer" versuchen.

Ich muss erstmal was loswerden, mir ist aufgefallen, das du mit einer der aktivsten User bist und Hilfst wo du kannst, dafür möchte ich mich bei dir bedanken, heut zu Tage ist das nicht mehr selbstverständlich.

Wenn du weiter so machst, dann werde ich dich nurnoch persönlich anschreiben. 😀 ne ist nur spass, keine Angst

LG
 
Hallo Männers,

hab da mal noch ne Frage.

Ich habe jetzt diesen ListCellRenderer
genommen und möchte das "Object elements[][]" mit meinen Daten füllen, das bekomme ich Irgendwie nicht in den Griff.

Ich habe mir gedacht, das ich es mit einer for-schleife lösen kann, aber es klappt nicht.

hat da einer ne Idee?
 
Hab mir deinen Link nicht angesehen. Hab mal dieses Beispiel benutzt:

Java:
File[] files = dir.listFiles();
		
		JList<File> list = new JList<File>(files);
		list.setCellRenderer(new ListCellRenderer<File>() {
			private DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
			
			@Override
			public Component getListCellRendererComponent(JList<? extends File> list, File value, int index, boolean isSelected, boolean cellHasFocus)
			{
				JLabel label = (JLabel)defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
				String fileName = value.getName();
				String fileNameNoExt = fileName.substring(0, fileName.lastIndexOf("."));
				label.setText(fileNameNoExt);
				
				return label;
			}
			
		});
 
Ich [...] möchte das "Object elements[][]" mit meinen Daten füllen, das bekomme ich Irgendwie nicht in den Griff.
Hier liegt offenbar ein grundsätzliches Verständnisproblem vor. Im ListCellRenderer wird gar nix "befüllt" oder sonstwie am übergebenen Objekt geändert. Der ListCellRenderer bekommt ein Object (welches auch ein Object[] sein kann), pickt sich die Informationen raus, die er braucht, und verwendet diese, um eine wie auch immer geartete java.awt.Component zu erzeugen oder abzuändern.
Wenn deine anzuzeigenden Objekte Instanzen von java.io.File ist, ist der von dir verwendete Renderer ungeeignet.
 
Ich verstehe nicht, wieso er ungeeignet sein soll, ich habe es jetzt in dem Moment so hinbekommen, wie ich es mir vorgestellt hatte.

Java:
for (int s = 0; s < file.length; s++)
{
File userHome = new File(file[s]);
File[] files2 = userHome.listFiles();
 
Object[][] elements = new Object[files2.length][4];
								
for (int k = 0; k < files2.length; k++) 
{
     elements[k][0] = new Font("Helvetica", Font.PLAIN, 15);
     elements[k][1] = Color.BLACK; 

     Icon ico = FileSystemView.getFileSystemView().getSystemIcon(files2[k]);
     elements[k][2] = ico;

     String[] endungEntf = files2[k].getName().split(Pattern.quote( "." ));				
     elements[k][3] = endungEntf[0];
} 


list[s] = new JList(files2);
list[s].setFixedCellHeight(App.wert_hoeheDerZelleInDemDerLinkSteht); // Höhe der Zelle
list[s].setCellRenderer(new FileListCellRenderer());
list[s].setBounds(startPunpt_x, 30, breite, framehoehe - 119);
 
scrollPane[s].setViewportView(list[s]);
}

und hier nochmal die Renderer-Klasse
Java:
package main;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
class MeinListCellRenderer implements ListCellRenderer {
  protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
  public Component getListCellRendererComponent(JList list, Object value, int index,
      boolean isSelected, boolean cellHasFocus) {
    Font theFont = null;
    Color theForeground = null;
    Icon theIcon = null;
    String theText = null;
    JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index,
        isSelected, cellHasFocus);
    if (value instanceof Object[]) {
      Object values[] = (Object[]) value;
      theFont = (Font) values[0];
      theForeground = (Color) values[1];
      theIcon = (Icon) values[2];
      theText = (String) values[3];
    } else {
      theFont = list.getFont();
      theForeground = list.getForeground();
      theText = "";
    }
    if (!isSelected) {
      renderer.setForeground(theForeground);
    }
    if (theIcon != null) {
      renderer.setIcon(theIcon);
    }
    renderer.setText(theText);
    renderer.setFont(theFont);
    return renderer;
  }
}
//public class ComplexRenderingSample {
//  public static void main(String args[]) {
//    Object elements[][] = {
//        { new Font("Helvetica", Font.PLAIN, 20), Color.RED, new MyIcon(), "A" },
//        { new Font("TimesRoman", Font.BOLD, 14), Color.BLUE, new MyIcon(), "A" },
//        { new Font("Courier", Font.ITALIC, 18), Color.GREEN, new MyIcon(), "A" },
//        { new Font("Helvetica", Font.BOLD | Font.ITALIC, 12), Color.GRAY, new MyIcon(), "A" },
//        { new Font("TimesRoman", Font.PLAIN, 32), Color.PINK, new MyIcon(), "A" },
//        { new Font("Courier", Font.BOLD, 16), Color.YELLOW, new MyIcon(), "A" },
//        { new Font("Helvetica", Font.ITALIC, 8), Color.DARK_GRAY, new MyIcon(), "A" } };
//    JFrame frame = new JFrame("Complex Renderer");
//    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//    JList jlist = new JList(elements);
//    ListCellRenderer renderer = new MeinListCellRenderer();
//    jlist.setCellRenderer(renderer);
//    JScrollPane scrollPane = new JScrollPane(jlist);
//    frame.add(scrollPane, BorderLayout.CENTER);
//    frame.setSize(300, 200);
//    frame.setVisible(true);
//  }
//}
class MyIcon implements Icon {
  public MyIcon() {
  }
  public int getIconHeight() {
    return 20;
  }
  public int getIconWidth() {
    return 20;
  }
  public void paintIcon(Component c, Graphics g, int x, int y) {
    g.setColor(Color.RED);
    g.drawRect(0, 0, 25, 25);
  }
}
 
Ich verstehe nicht, wieso er ungeeignet sein soll, ich habe es jetzt in dem Moment so hinbekommen, wie ich es mir vorgestellt hatte.
Naja, was ich geschrieben habe, war ja auch
Wenn deine anzuzeigenden Objekte Instanzen von java.io.File ist, ist der von dir verwendete Renderer ungeeignet.
Die Objekte, die du jetzt anzeigen lässt, sind keine File-Objekte mehr, sondern Instanzen von Object[].
Du kannst natürlich Objekte vom Typ X in solche vom Typ Y umwandeln und dann einen Renderer verwenden, der mit Objekten des Typs Y umgehen kann, aber mir wäre dieser Umwandlungsschritt zu aufwändig.
Ausserdem nutzt du ein paar Möglichkeiten, die dir MeinListCellRenderer bietet, gar nicht. Alle Einträge haben dieselbe Farbe, denselben Font und dasselbe Icon. Deshalb könntest du diese Eigenschaften auch im Renderer direkt setzen, anstatt sie im Renderer erst aus dem Array auszulesen. Nur der Text unterscheidet sich. Aber das wegschneiden der Dateiendung kann auch im Renderer direkt passieren, wie von X5-599 gezeigt.
Aber jeder so wie er mag. Oder: wieso einfach, wenns auch kompliziert geht.
 
Edit: kleine Korrektur. Natürlich haben deine Einträge nicht alle dasselbe Icon, aber das richtige Icon könnte sich ein FileListCellRenderer aus einem übergebenen item der Klasse File auch ohne weiteres besorgen.
Was wir gerade auch noch einfällt: Nehmen wir mal an, du möchtest aus der JList ein Objekt auswählen und damit etwas machen, z. B. bei Directories eine Datei anlegen oder bei Dateien diese mit einem FileInputStream öffnen. Leider enthält deine JList jetzt keine File Objekte mehr, sondern Object[]s, und wenn du mit den Einträgen etwas machen willst (also mehr als sie einfach nur anzeigen zu lassen), müsstest du aus den Object[]s die Files wieder rekonstruieren. Spätestens an dem Punkt wäre das ganze für mich viel zu unelegant und aufwändig.
 
So, da bin ich wieder.

Ich habe die ganze Sache jetzt so gelöst, nach Vorschlag von #X5-599, ich hoffe mal, das es nicht mehr so schlimm wie vorher.

Java:
JList<File> list = new JList<File>(files2);
							    	
list.setCellRenderer(new ListCellRenderer<File>() {
private DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
								
							 	 
@Override
public Component getListCellRendererComponent(JList<? extends File> list, File value, int index, boolean isSelected, boolean cellHasFocus)
{
							 		
JLabel label = (JLabel)defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
							 							 	
if(value!=null)
{
Icon icon= FileSystemView.getFileSystemView().getSystemIcon(value);
img = ((ImageIcon)icon).getImage();
String fileName = value.getName();
String fileNameNoExt = fileName.substring(0, fileName.lastIndexOf("."));
							         
label.setIcon(new CircleIcon());
							         
label.setText(fileNameNoExt);
label.setFont(new Font("Tahoma", Font.PLAIN, 15));
							         
							         
if (isSelected)
{ 
label.setEnabled(true);
label.setBackground( new Color(200,210,220) );
label.setForeground(Color.black);
}
else
{
label.setBackground(Color.white);
label.setForeground(Color.black);
label.setBorder(null);
}
if (cellHasFocus)
{
label.setBorder( new LineBorder(Color.blue));
}
else
{
label.setBorder(new EmptyBorder(10, 1, 10, 1) );
}
}
return label ;
}
});

und hier noch die klasse für das Icon

Java:
class CircleIcon implements Icon
{
 public void paintIcon( Component c, Graphics g, int x, int y )
 {
	 Image scaledImage = Frame.img.getScaledInstance(getIconWidth(), getIconHeight(),Image.SCALE_SMOOTH);
	 g.drawImage(scaledImage, 2, 10, Color.WHITE, null);
 }

 public int getIconWidth()
 {
  return 20;
 }

 public int getIconHeight()
 {
  return 20;
 }
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben