Swing JScrollBar in einem JPanel mit FlowLayout

beastofchaos

Bekanntes Mitglied
Hallo Leute,
Mein Problem sollte jetzt schon ein bisschen klar sein, aber ich erklärs mal:
Ich hab eine horizontale Leiset (JPanel) mit einem linksbündigen FlowLayout, in dem ich mehrere Komponenten nebeneinander lege. Jetzt hab ich grad eine Klasse erstellt, die so aussieht

Java:
public class WidthScroller extends JScrollBar{
	public WidthScroller() {
		super();
        setPreferredSize(new Dimension(300, 60));
        setSize(new Dimension(300, 60));
        setOrientation(JScrollBar.HORIZONTAL);
        addAdjustmentListener(new AdjustmentListener(){
            public void adjustmentValueChanged(AdjustmentEvent e) {
            	WidthScroller.this.setToolTipText(getValue() + "");
            	valueChanged();
            }
        });
        setValues(2, 1, 1, 200);
	}
	
	public void valueChanged(){
		
	}
}
Es handelt sich hierbei um ein JScrollBar, mit der ich einen Wert im Programm ändern möchte.

Das Problem: Neben allen anderen Komponenten (JButton, JCheckBox, JComboBox,...) wird er als einiziger ungewollt klein. Ich hab mal nachgeschaut und bei meinen anderen Komponenten hab ich auch nie die Größe eingestellt. Ein JButton mit einem Icon oder eine JComboBox mit mehreren Icons haben sicher schon eine feste Größe an sich iwo in den Klassen festgesetzt. Nur diese ScrollBar will sich nicht anpassen und hat zwar dieselbe Höhe, wie alle anderen Komponenten, aber seine Breit ist ca. 6... Wieso lässt sich das nicht mit PreferredSize oder Size einstellen ??

Gruß, Thomas
 
Wieso extendest du denn überhaupt JScrollbar? Alle funktionen die du im Konstruktor aufrufst sind public, du könntest den genauso aus deinem Programm erstellen.
Dein Problem liegt höchstwahrscheinlich aber nicht im ScrollBar selbst, sondern im Layout des Containers dem du ihn hinzufügst. Insofern musst du mehr code posten, damit man dir helfen kann.
 
Ich hab vorallem die Klasse gemacht, um das alles unterzuordnen und um die Übersicht zu behalten. Ich weiß, dass es auch ohne geht, aber ich hab da mehrere Komponenten und die alle in einer Klasse zu binden ist mir zu unübersichtlich. Deswegen hat jede Komponente iene Klasse(auc hwenn es bei der hier gar kein Sinn macht vll).

Ich zeig mal ein Screenshot morgen, wenn ich wieder fit bin, wie das insgesamt aussieht. Daran kann ich am besten die Ordnung zeigen
 
Hier ein Bild im Anhang, wie die Oberfläche meines Programmes aussieht. Hab da auch mal Notizen gemacht, wie das aufgebaut ist. Im Code gibt es auch nicht mehr als "new WidthScroller()" und "add()", weshalb mir es unnötig scheint, Codestellen rauszuschneiden und zu posten. wenn ihr wollt, mach ich es trotzdem.

Gruß, Thomas

PS: Für größere Auflösung, hier ein externer Link: http://s14.directupload.net/images/110930/6cdx7ml4.png
 

Anhänge

  • DrobBox-Show.jpg
    DrobBox-Show.jpg
    53,3 KB · Aufrufe: 38
Nimm das setSize() raus, setPreferredSize() ist schon richtig und reicht auch. Eigentlich sollte das auch funktionieren. Hast du (grob) folgende Ausführungs-Reihenfolge im Code:

Java:
WidthScroller s = new WidthScroller();
//...
panel.add(s);
//...
frame.add(panel);
//...
frame.pack();

?

Grundsätzlich muss es am Layout oder der Kombination der Layout Manager in der GUI liegen. Verwendest du überall einen Layout-Manager? Oder arbeitest du irgendwo auch mit dem null-Layout und setBounds oder setSize?

edit: Auf blöd versuch mal
Code:
setMinimumSize()
. Würde mich aber wundern wenn es dann ginge, bzw. es würde wohl nur das Problem, das du bereits hast überdecken aber nicht wirklich entfernen.
 
Zuletzt bearbeitet:
Hab alle setSize-Möglichkeiten ausprobiert. also ich mach mal noch ein bild, in dem ich einfach zu jedem Panel das Layout zeige 😀 siehe Anhang

Mir fällt grad ein unterschied auf. das mit dem FloawLayout stimmt nicht so ganz. es ist ein BoxLayout(BoxLayout.X_AXIS). Hier der Konstruktor dieses Panels:

Java:
     public ToolPanel(Main target, int maxHeight){
    	super();
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
        main = target;
        this.height = maxHeight;
        layoutPanel();
    }
    
    //-------------------------------------------------------------------//
    
    private void layoutPanel(){
    	createClearLabel();
    	
    	comboTools = new ToolsBox(this);
    	createClearLabel();
    	
    	scrollerWidth = new WidthScroller();
    	add(scrollerWidth);
    	
//    	comboWidth = new WidthBox(this);
    	labelWidth = createClearLabel();
    	
    	comboBehaviour = new BehaviourBox(this);
    	labelBehaviour = createClearLabel();
        
    	comboType = new ShapeBox(this);
    	labelType = createClearLabel();
        
    	checkPanel = new ColorCheckPanel(this);
        
    	getPreferredSize().height = height;
    }
    
    private JLabel createClearLabel(){
    	JLabel label = new JLabel("  ");
    	add(label);
		return label;
    }

Edit: Wenn ich einfach ein FlowLayout mache, verschieben sich iwie alle Komponente ein stpck nach unten, so dass ich sie nicht mehr ganz sehe. Im Modus "Freihand" ist die Scrollbar dann gar nicht zu sehen. Beim Shape zeichnen schon und sogar in einer "angemessenen" Größe. Das kann zwar ein Fehler im Code sein und das muss ich selber rausfinden, aber dass alles nach unten geschoben wird, verwirrt mich iwie...
 

Anhänge

  • DrobBox-Show.jpg
    DrobBox-Show.jpg
    76,8 KB · Aufrufe: 33
Zuletzt bearbeitet:
Vielleicht hab ich mich nur ein bisschen zu kompliziert ausgedrückt, weshalb da keiner helfen kann, aber im Grunde genommen ist das Problem:

Meine JScrollBar wird im BoxLayout total verkleinert, so dass man fast nur noch einen Strich sieht.

Gruß, Thomas
 
Lass dir mal als erstes zur Laufzeit die prefferedSize ausgeben - rein zur Kontrolle.
Am besten du baust dir einen kleinen Dummy-Button ein, der das übernimmt. Den drückst du dann nachdem die GUI gestartet hat (Du kannst es auch direkt im code machen, aber du solltest dir sicher sein, dass es zum richtigen Zeitpunkt ist).

Wenn der korrekte eingestellte Wert geliefert wird, lass dir auch mal getDimension()/getSize() ausgeben, um das mit der preferredSize abzugleichen.

Dann weißt du zumindest schon mal konkreter, welche Werte das BoxLayout ggfls ignoriert oder ändert.

Und zur Sache mit dem FlowLayuot: Dass sich alles nach unten schiebt wie du sagst ist auch nicht normal. Irgendwas stimmt bei dir nicht. Am besten wäre es eig. du postet die gesamte Appliaktion. Wenn es Dinge sind, diekeiner sehen soll, nimm die Logik raus. Aber der gesamte ungeänderte GUI-Code wäre nicht schlecht. Da ist alles recht verflochten und man kann schwer sagen woran's liegt wenn man nur kleine Ausschnitte daraus sieht. Denn der Code deiner ScrollBar an sich ist soweit eigentlich richtig.

Du kannst auch einen Upload aller Sourcen irgendwo machen und uns den Link zukommen lassen.
 
Also da ich sowieso eher auf das BoxLayout abziele, mach ich das noch nicht, aber wenn ich mit deinen Tipps noch nicht weiterkomme, werde ich noch ein paar Ausschnitte mehr posten. Die Applikation an sich lieber nicht, da es sich um ein ca. 70-Klassen schweres Projekt handelt. Und da die Logik rauszuziehen wäre dann natürlich viel zu aufwendig :/

Also ich versuch das morgen einfach mal mit dem dummy, könnt es aber auch mit Timer und "System.out.println()" versuchen oder im Debugger.

Gruß und Danke, Thomas
 
Also im Anhang einmal ein Bild mit dem BoxLayout, wo ihr rechts ein Teil von der Oberfläche seht. Oben idner Leiste seht ihr einen Stift in einer COmboBox und daneben einen dünnen Strich (die ScrollBox).
Per Timer hab ich mal folgendes ausgebenlassen:
Code:
System.out.println("" + scrollerWidth.getSize().toString() + "      ---     " + scrollerWidth.getPreferredSize().toString());
Das seht ihr in dem einen Bild im Code auch teilweise und in der Ausgabe wird alle Sekunde eine solche Zeile hinzugefügt durch den Timer:
"java.awt.Dimension[width=5,height=28] --- java.awt.Dimension[width=60,height=300]"
Also die Höhe passt er er durch das BoxLayout entsprechend gut an, aber die 5 sind unbegreiflich. Er will es einfach so eng wie möglich machen. 2 LEs jeweils pro Button ( < und > ) und 1 LE für die Mitte, so mal meine These 😀

Beim FlowLayout hab ich auch ein Bild für euch, in der selben Position - auch im Anhang zu finden.
Hintergrund, anscheinend mag er da die Höhe 17 am liebsten, da es bei Höhe 60 nicht mehr angezeigt wird. anscheinend wird es abhängig von der Differenz von 17 verschoben, wenn ihr versteht was ich meine. Ich hab jetzt mal die Maße "width = 120" und "height = 17" also genommen und tatsächlich wird die ScrollBar auch so lang angezeigt. Leider überlager sie iwie dabei die anderen Komponenten, die eig. auch noch zu sehen sein sollten. Wenn ich es auf "width = 60" runterschraube, seh ich zumindest eine weitere noch. Und außerdem wird es nicht in jedem "Modus"(Freihand zeichnen, Radieren, Shape zeichnen"), sondern nur in diesem einen, was so gut wie gar nicht an meinem Code liegen kann. Es wird dann einfach nicht angezeigt, als wär es nicht da. Da also FlowLayout mir mehrere unerklärliche Hürden stellt kehre ich zum
Code:
new BoxLayout(this, BoxLayout.X_AXIS)
zurück, was mir nur das Problem aufwirft, dass es die Breite minimal macht. Auch wenn ich im Timer das mit getSize().width = oder setSize() versuche, ist sofort danach immer noch die gleiche Size wie vorher... (?)

Gibt es iwie eine andere Möglichkeit, als diesen verwirrenden Weg von PrefferedSize/Size zu nehmen, sondern einfach zu sagen: "JScrollBar, verkleiner dich bloß nicht!!!"
 

Anhänge

  • DrobBox-Show.jpg
    DrobBox-Show.jpg
    98,3 KB · Aufrufe: 34
  • DrobBox-Show2.jpg
    DrobBox-Show2.jpg
    98,1 KB · Aufrufe: 23
Gibt es iwie eine andere Möglichkeit, als diesen verwirrenden Weg von PrefferedSize/Size zu nehmen, sondern einfach zu sagen: "JScrollBar, verkleiner dich bloß nicht!!!"
Es gibt wie ich schon vorher sagte auch setMinimumSize(). Schon mal versucht? Aber im Endeffekt hat immer der Layout Manager das sagen. Wenn er der Meinung ist, die Komponente muss kleiner werden, dann macht er sie kleiner, egal was die preferred oder minimum size vorgibt. (setSize()/setBounds() werden von Layout Managern übrigens komplett ignoriert, also das kannste dir sparen)

Wir brauchen mehr Code. Es liegt nicht am Box- oder FlowLayout selbst, es liegt an der Kombination deiner Layouts und/oder Widgets und deren Einstellungen. Ich sag nochmal das einfachste wäre wenn du mir einfach dein gesamtes Projekt als zip irgendwo hochlädst. Keine Sorge, ich kuck dir da schon nix weg 😉 Aber dann hab ich die gesamte GUI und kann direkt im Code arbeiten.
 
Zuletzt bearbeitet:
Ok. ich schiebs dir morgen per pn rüber. Ich bezweifle, dass du den Überblick kriegst, aber du darfst es ruhig versuchen 😉 Ich kann mir ehrlich gesagt nicht vorstellen, dass es durch "äußere" Umstände entsteht. Was unterscheidet eig das BoxLayout vom FlowLayout, weil es mir vom Sinn her iwie gleich erscheint, alles nebeneinander zu legen, oder liegt gerade da das Problem, dass das BoxLayout die Komponenten unterschiedlich vergrößert? Wenn ich ein bisschen mehr vom BoxLayout versteht, kann ich es ja vll. auch erschließen 😉
 
Mir ist grad noch was eingefallen. Adde mal bitte zwischen deinem Pinsel-Button da und der Scrollbox einen Glue:

Java:
add(Box.createHorizontalGlue());

Damit schiebt er dir die Scrollbar zwar ganz nach rechts, könnte aber sein dass sie dann so breit ist wie du willst.. Nur testweise.

Das BoxLayout ist in der Tat etwas ätzend. Scheint manchmal willkürlich zu handeln. Ich selbst vermeide es wenn möglich. Ich verstehe auch nicht warum du das da anwenden willst. Dein Panel da oben ist doch das beste Beispiel für ein FlowLayout. Diese Sache mit dem nach unten schieben ist dann nur eine falsche Alignment-Einstellung oder falsche Größensetzung per setPreferredSize.
 
Also nach mehreren Ausprobieren und Feststellugnen, hab ich alles in ein FlowLayout bekommen. Diese Verschiebung ist immer noch da, egal wo und in welchem anderen Layout es liegt. Wenn ich das FlowLayout so konstruiere:
Code:
super(new FlowLayout(FlowLayout.LEFT, 5, -2));

Dann liegt es fast perfekt drinnen, aber mir ist es zu wenig abstand zum Rand nach oben und unten hin.


Okay, habs jetzt endlich eig. Hab das mit dem FlowLayout so gelassen, aber in dem GridBagLayout, in dem es liegt, die Insets so verändert, dass genügend Platz nach oben und unten bleibt.

Kleine Nebenfrage: Was haltet ihr von dem Design meines Programms, im Anhang ein Bild, wie es jetzt aussieht.

Gruß, Thomas
 

Anhänge

  • DrobBox-Show.jpg
    DrobBox-Show.jpg
    47 KB · Aufrufe: 32
Was haltet ihr von dem Design meines Programms, im Anhang ein Bild, wie es jetzt aussieht.
Ist doch okay soweit. Übersichtlich. Ich würd allerdings noch paar mehr Farbtöne in die Leiste unten reinnehmen. Vllt von jeder Farbe noch eine etwas hellere und dunkelere Variante (jeweils übereinander, also in einem Gitter angeordnet)
 
Im moment ist es doch schon teilweise so. oben ist klares rot zum Beispiel und unten hellrot. Ich werd das mal verbessern, dass oben dunkelrot, in der Mitte größere Stelle normales rot und unten hellrot ist.

Es ist nämlich für jede Farbe so ein kleines Spektrum von Dunkel nach Hell und kein Gitter 😉

Es gibt nochmal einen extra Dialog (durch dem Button "Mehr..." bekommst du ein (von mir entwickeltes) volles Spektrum 😀)

Gruß, Thomas

Edit: ich frag mich grad, ob es gut ist, dass man für die obere und utnere Leiste einzelnd die beiden Farben auswählen soll oder ob man nur zwei auswählt, die dann oben und unten (und später in einer weiteren Seitenleiste) verwendet werden. Im Moment könnte man oben z.B. rot-grün und unten schwarz-lila, also ziemlich häßlich. Andersrum würd ich es "einheitlicher" gestalten und trotzdem darf der Nutzer mitbestimmen 🙂

Edit2: Perfekte Worte! So werd ich das glaub ich in meiner BLL(im Abi) über dieses Programm auch schreiben 🙂
 

Zurück
Oben