Swing Drive-ComboBox

  • Themenstarter Themenstarter jf
  • Beginndatum Beginndatum

jf

Bekanntes Mitglied
Hallo, ich möchte eine ComboBox haben, welche mir alle verfügbaren Laufwerke auflistet.
Dabei soll die Datenträgerbezeichnung und der Pfad jeweils in einer eigenen Spalte stehen:
Code:
System              C:\
Wechseldatenträger  D:\

Mir fehlt gerade die zündende Idee, wie ich den ListCellRenderer dazu implementieren sollte.
Hat jemand einen Tipp dazu?

Außerdem muss ich aus dem String
Code:
System (C:)
das
Code:
(C:)
entfernen.
Wie lautet die Regular Expression hierfür?
"(?🙂" funktioniert nicht - und die Klammern escapen klappt leider auch nicht.
 
Hallo, ich möchte eine ComboBox haben, welche mir alle verfügbaren Laufwerke auflistet.
Dabei soll die Datenträgerbezeichnung und der Pfad jeweils in einer eigenen Spalte stehen:
Code:
System              C:\
Wechseldatenträger  D:\

Mir fehlt gerade die zündende Idee, wie ich den ListCellRenderer dazu implementieren sollte.
Hat jemand einen Tipp dazu?
Was hast Du denn vorliegen und wie soll es aussehen? Spalten in einem Listeneintrag könnte z.B. erhalten wenn wann zwei JLabels auf einem JPanel als Renderer verwendet....

Außerdem muss ich aus dem String
Code:
System (C:)
das
Code:
(C:)
entfernen.
Wie lautet die Regular Expression hierfür?
"(?🙂" funktioniert nicht - und die Klammern escapen klappt leider auch nicht.
Wie schaut denn Dein Versuch aus? Reicht eventuell einfach:
Java:
String text = "System (C:)";
System.out.println(text);
text =  text.replaceAll("\\s*\\(.*", "");
System.out.println(text);
 
Was hast Du denn vorliegen und wie soll es aussehen? Spalten in einem Listeneintrag könnte z.B. erhalten wenn wann zwei JLabels auf einem JPanel als Renderer verwendet....
Die Datenträgerbezeichnung sollte einfach vom Laufwerksbuchstaben getrennt werden, damit es besser lesbar ist.
Das mit den Label wird aber nur funktionieren, wenn ich denen ein PreferredSize verpasse - eine dynamische Einrückung je nach Datenträgerbezeichnung ist nicht möglich?


Wie schaut denn Dein Versuch aus? Reicht eventuell einfach:
Java:
String text = "System (C:)";
System.out.println(text);
text =  text.replaceAll("\\s*\\(.*", "");
System.out.println(text);
Danke, das tut! 🙂

Damit ich es aber auch verstehe:
"\\s" bedeutet Whitespace, der Stern am Ende steht für beliebige Zeichen, aber was ist die Bedeutung von "*\\(."?
 
Die Datenträgerbezeichnung sollte einfach vom Laufwerksbuchstaben getrennt werden, damit es besser lesbar ist.
Das mit den Label wird aber nur funktionieren, wenn ich denen ein PreferredSize verpasse - eine dynamische Einrückung je nach Datenträgerbezeichnung ist nicht möglich?
Um es einfach zu halten könnte man ja in dem Label mit dem Laufwerksbuchstaben den Text rechtsbündig ausrichten. Die Labels auf ein JPanel mit BorderLayout jeweils in CENTER und EAST anordnen. Das setzen der PreferredSize ist dann nicht notwendig.
Damit ich es aber auch verstehe:
"\\s" bedeutet Whitespace, der Stern am Ende steht für beliebige Zeichen, aber was ist die Bedeutung von "*\\(."?
* beliebig viele (in dem Fall Whitespaces)
\ Java Escape für den \
\ Regex Escape für die (, da diese in Regex ein Metazeichnen ist
. beliebiges Zeichen
 
Um es einfach zu halten könnte man ja in dem Label mit dem Laufwerksbuchstaben den Text rechtsbündig ausrichten. Die Labels auf ein JPanel mit BorderLayout jeweils in CENTER und EAST anordnen. Das setzen der PreferredSize ist dann nicht notwendig.
Ok, das Problem ist, dass ich im Falle dessen, dass eine bestimmte Datei in der Wurzel gefunden wird, diese dem Pfad hinzufgefügt werden soll, also:
Code:
System              C:\
Wechseldatenträger  D:\datei.ext
Rechtsbündig würde da nicht gut aussehen. Angeachtet dessen, wäre ein sehr großer Freiraum in der Mitte auch nicht gerade schön.
Hat jemand hierzu vlt. noch eine zündende Idee?

* beliebig viele (in dem Fall Whitespaces)
\ Java Escape für den \
\ Regex Escape für die (, da diese in Regex ein Metazeichnen ist
. beliebiges Zeichen
Prima, danke!
 
Zuletzt bearbeitet:
das listmodel der combobox mit nem tablemodel einer tabelle kombinieren (ähnliche wie wenn man eine TreeTable machen möchte). Das wäre mein Ansatz, aber habe grad nichtmal ansatzweise ne Idee, wie ich anfangen sollte (falls sowas überhaupt geht)
 
das listmodel der combobox mit nem tablemodel einer tabelle kombinieren (ähnliche wie wenn man eine TreeTable machen möchte). Das wäre mein Ansatz, aber habe grad nichtmal ansatzweise ne Idee, wie ich anfangen sollte (falls sowas überhaupt geht)
Ich kenne mich mit Renderern leider nicht so gut aus. Ich wollte daher erst einmal den erst Tipp von Michael... ausprobieren - aber mit Pfad links und Laufwerksbezeichung rechts (rechtsbündig).
Haber aber hier schon Probleme... Folgender Renderer ändert zwar die Umrandung der Selektierung, kann aber keinen Text ausgeben (sobald ich super.getListCell... auskommentiere, ist die Liste leer):


Java:
@SuppressWarnings("serial")
class ColorCellRenderer extends DefaultListCellRenderer {

	// Width doesn't matter as the combo box will size
	private final static Dimension preferredSize = new Dimension(0, 20);
	
	JLabel lblLeft  = new JLabel();
	JLabel lblRight = new JLabel();
	
	
	public ColorCellRenderer() {
		this.setLayout(new BorderLayout());
		this.add(lblLeft,  BorderLayout.CENTER);
		this.add(lblRight, BorderLayout.EAST);
		this.setPreferredSize(preferredSize);
	}
	
	  
	public Component getListCellRendererComponent(JList list,
			                                      Object value,
			                                      int index,
	                                              boolean isSelected,
	                                              boolean cellHasFocus) {
	
		super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
			
		//System.out.println((String) value);
		lblLeft.setText((String) value);
		
		
		if (value instanceof Color) {
			this.setBackground((Color) value);
		}
		    
		if(cellHasFocus || isSelected){
			this.setBorder(new LineBorder(Color.ORANGE));
		} else {
			this.setBorder(null);
		}
		    
		return this;
	}
}

Ich verstehe den Renderer so: es ist eine Componente, welche jeden einzelnen Listeneintrag zeichnet.
Die Item-Informationen erhält die Komponente über das ListCellRenderer-Interface (getListCellRendererComponent()).

Wenn dem so wäre, dann müsste aber
Code:
lblLeft.setText((String) value);
doch zu eine Ausgabe führen... ???:L

Ich verstehe das nicht! :bahnhof:
Wer ist schlauer?
 

Zurück
Oben