Oberfllächengestaltung

Status
Nicht offen für weitere Antworten.

franzhai

Mitglied
Hallo,

Ich arbeite an einem Projekt, für das ich Scrollbars unterschiedlicher Länge vertikal anordnen möchte.

sb.png


Die Länge der Regler soll sich zudem im Programmverlauf noch variieren können.

Deshalb würde ich gerne wissen, ob es möglich ist Länge und Position der Scrollbars durch Pixel zu bestimmen.

Vielen Dank!

franzhai
 

Campino

Top Contributor
Code:
ScrollBar.setBounds(x, y, width, height); //geerbt aus Component, funktioniert also bei allen Componenten, AWT und Swing
 

franzhai

Mitglied
Vielen Dank, Campino! Es funktioniert wunderbar.

Dürfte ich da noch eine kleine Frage anhängen: Nach welcher Methode geht man vor, wenn man bei jeder Änderung eines Scrollbars einen Block Befehle ausgeführt haben wollte?

Danke!

franzhai
 

Campino

Top Contributor
Du meinst, dass du jedes mal, wenn eine ScrollBar ihre größe ändert, eine Methode (oder auch einen Block befehle) ausgeführt haben willst, oder? ich bin noch etwas müde ;))

Also, ich würde eine resize-Methode schreiben, der übergibst du die neue Position und Größe und die Scrollbar. So:
Code:
private void resize(ScrollBar sb, int x, int y, int width, int height){
    sb.setBounds(x, y, width, height);
    //deine Befehle
}

Mit dieser Version kannst du für alle Scrollbars die selben Befehle nutzen, ohne mehrere Methoden nutzen zu müssen. Du kannst mit einer if()-Abfrage feststellen, welche Scrollbar vergrößert/verkleinert wurde, wenn du diese Information brauchst. Du maussst dann natürlich immer diese Methode zum Ändern der ScrollBargröße verwenden.

Achso: damit das mit dem Größenändern überhaupt geht, muss das Layout auf null stehen. Du musst dann für alle Komponenten die Größe und Position angeben, sonst werden sie garnicht dargestellt.
Code:
//c ist die Componente, wo deine Scrollbars drinnen sind, also ein Frame, Applet, Panel, Canvas oder was auch immer...
c.setLayout(null);
 

franzhai

Mitglied
Vielen, vielen Dank! Wenn man jetzt bei jeder Änderung des Reglers die Größe desselben ändern möchte, greife ich auf eine Funktion namens "adjustmentValueChanged" zurück, die aufgerufen wird, wann immer man den Regler verschiebt. Die jetzige Version funktioniert zwar, nur findet die Größenänderung leider nicht statt.


Code:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;


public class Scrollbar3 extends Applet implements AdjustmentListener {

Scrollbar sb1;

  public void init(){

    setLayout(null);

    Scrollbar sb1 = new Scrollbar(0);

    resize(sb1, 10, 10, 100, 15);

    sb1.addAdjustmentListener( this);

    add(sb1);
  }

    private void resize(Scrollbar sb, int x, int y, int width, int height){
      sb.setBounds(x, y, width, height);
    }

    public void adjustmentValueChanged(AdjustmentEvent e){
      resize(sb1, 10, 10, 400, 15);
    }
}
 
G

Gast

Gast
Hallo,
irgendwie vermischt du hier mehrere Dinge.

public void adjustmentValueChanged(AdjustmentEvent e){
resize(sb1, 10, 10, 400, 15);
}
das soll wohl eine Methode werden um den Regler auf der Scrollbar zu verschieben? Warum rufst du in der Methode die Methode resize auf? Schreibe doch mal den Methodenrumpf zu der Methode adjustmentValueChanged und rufe diese Methoden
beide auf deinem neu instanzierten Objekt auf.

LG
Gabi
 

franzhai

Mitglied
Code:
public void adjustmentValueChanged(AdjustmentEvent e){
}

Dies ist eine Methode, die beim Verschieben des Reglers aktiv wird. Bei diesem Verschieben soll der Regler seine Größe ändern - deshalb der Aufruf von "resize".

Das Problem dürfte das Neuzeichnen des Scrollbars sein. Wie könnte man das anstellen?

Merci.
franzhai
 
G

Gast

Gast
Du hast also diese Methode deklariert und initialisiert in dem Interface nehme ich an. Und nun möchtest du beim Aufruf dieser Methode im Rumpf gleichzeitig festlegen, das die Methode resize ausgeführt wird. Du brauchst also eine Referenz auf das Objekt was von sb1 referenziert wird, richtig? Wie wäre es dann mit sb1.resize(10,10,400,15)?
Das das
resize(sb1, 10, 10, 100, 15);
funktioniert verstehe ich ehrlich gesagt auch nicht so ganz, sb1 ist doch deine Variable und müsste außerhalb der Klammer stehen, also
sb1=resize (10,10,100,15)

LG
Gabi
 

Campino

Top Contributor
Gast hat gesagt.:
Du hast also diese Methode deklariert und initialisiert in dem Interface nehme ich an. Und nun möchtest du beim Aufruf dieser Methode im Rumpf gleichzeitig festlegen, das die Methode resize ausgeführt wird. Du brauchst also eine Referenz auf das Objekt was von sb1 referenziert wird, richtig? Wie wäre es dann mit sb1.resize(10,10,400,15)?
Das das
resize(sb1, 10, 10, 100, 15);
funktioniert verstehe ich ehrlich gesagt auch nicht so ganz, sb1 ist doch deine Variable und müsste außerhalb der Klammer stehen, also
sb1=resize (10,10,100,15)

LG
Gabi
NEIN, Gast du machst Mist. resize ist KEINE mwethode aus Scrollbar, sondern eine selbstgeschriebene. Sieh mal in meinen Post weiter oben oder sieh dir ihren Code komplett an, da ist resize() drinnen definiert.

FranziHai:
Willst du die ganze Komponente in ihrer Größe ändern oder nur das Teil was man hin und her schiebt? und warum wenn sich der Wert ändert? Das Ding wird quasi länger, wenn man seinen Wert ändert.

Neuzeichnen geht mit

Code:
Applet.repaint();
 

franzhai

Mitglied
Juhu! Mit einem Befehl namens
Code:
validate()
hat das Neuzeichnen geklappt. Ich bin zwar nicht sicher, ob meine Ausführungen immer für alle verständlich waren... Auf jeden Fall ein großes Danke den vielen Unterstützern!

franzhai
 
Status
Nicht offen für weitere Antworten.

Oben