eigener "Abstandshalter" vs. LayoutManager

i.b.fan

Aktives Mitglied
Hallo zusammen,

nachdem ich immer wieder mal Icons (mittels JLabel) auf einem Panel als "Controller" benutzen möchte, stehe ich vor der Frage, wie ich möglichst simpel und doch flexibel wenigstens rudimentär gestalterisch Einfluss nehmen kann.

Mein Denkansatz ist: Panel mit preferredSize anlegen, BoxLayout mit Ausrichtung verpassen und dann einfach die JLabels mit den Icons adden. (soweit noch nix Neues)
Nun brauche ich mal mehr, mal weniger Abstand zwischen den Icons (aus gestalterischen Gründen). Hierzu habe ich folgende Klasse(en) geschrieben, die mir ein transparentes Label mit transparentem Icon der übergebenen Ausdehnung erzeugt, welches ich dann einfach zwischen zwei "echten" Icons platziere:

panel.add(iconLabel1);
panel.add(new separator(3, 16);
panel.add(iconLabel2);

Was meint Ihr dazu? Ist das eine praktikable Lösung oder ein absoluter Tasse-Nagel-Ansatz?

i.b.fan 🙂

Hier die (funktionierende) Klasse:

Java:
/*
 * Creates a transparent label with transparent icon (size: width*height)
 */

package ibfan;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.Icon;
import javax.swing.JLabel;

/**
 *
 * @author i.b.fan
 */
public class Separator extends JLabel{

    private Separator(){}  //do nothing, only to avoid use from outside
            
    public Separator(int width, int height){

        super();

        if(width < 1) width = 1; //minimum size: one pixel
        if(height < 1) height = 1; //minimum size: one pixel

        this.setPreferredSize(new Dimension(width, height)); //könnte man weglassen
        this.setIcon(new TransparentIcon(width, height));

    }
}//end class Separator

class TransparentIcon implements Icon{

    private int width, height;
    private Color color = new Color(0,0,0,0); //transparent

    protected TransparentIcon(int width, int height){
        this.width = width;
        this.height = height;
    }

    public int getIconWidth(){
        return width;
    }

    public int getIconHeight(){
        return height;
    }

    public void paintIcon( Component c, Graphics g, int x, int y){

        g.setColor(color);
        g.fillRect(0, 0, width, height);
    }
}//end class TransparentIcon
[/Java]
 
Manche Leute sagen ja: Praktikabel ist, was funktioniert 😀
Aber ... ein einfaches JPanel, dessen PreferredSize passend gesetzt ist, hätte es vermutlich auch getan

Hmm, nicht ganz, da ja die Zwischenräume ungleichmäßig groß sein (können) sollen.

- oder eben gleich sowas wie aus Box (Java 2 Platform SE v1.4.2) ... :bahnhof:

Oh, das ist ja so ziemlich das, was ich wollte 😀
Muss ich gleich mal probieren. Nur komisch, dass es kein createHorizontalStrut() gibt - oder "dreht" sich das mit der AXIS mit?
Interessant klingt ja auch das "glue"...

Auf jeden Fall mal danke für den Tipp! 🙂

i.b.fan 🙂
 
Hmm, nicht ganz, da ja die Zwischenräume ungleichmäßig groß sein (können) sollen


Hm. Wo genau wäre der Unterschied zwischen einem
Java:
Separator s = new Separator(10,20);
add(s);
und einem
Java:
JPanel s = new JPanel();
s.setPreferredSize(new Dimension(10,20));
add(s);
(abgesehen von einer gesparten Zeile)?
 
[...]
Java:
JPanel s = new JPanel();
s.setPreferredSize(new Dimension(10,20));
add(s);
[...]

Ach so meintest Du das *stirnpatsch*. Ich dachte Du meinst das Panel, auf dem die Labels liegen. Und da kriegt man durch Vergrößern mit entspr. Layout ja (erstmal) nur gleichmäßige Abstände hin.

Manchmal kann es sooo einfach sein - aber da sieht man halt die mangelnde Übung!
Ich hatte das übrigens als erstes genau so mit einem Label (ohne Icon) probiert, aber wenn da kein Text drin steht geht das wohl trotz PreferredSize auf 0 Pixel. Drum dann die Krücke mit dem transparenten Icon 😉

i.b.fan 🙂
 

Neue Themen


Zurück
Oben