Wichtig!

Hallo,

für ein Informatikprojekt muss ich einen Button in der Form eines Schalter (wie auf Elektronikschaltplänen) erzeugen. Ihn soll man per Mausklick schließen können und wieder öffnen können. Ist es möglich

  • einen JToggleButton dafür zu verwenden und ob es irgendwie möglich ist ihn zu überschreiben oder überzumalen

  • von AbstractButton etwas Eigenes zu erzeugen.

wenn ja, wie??
Außerdem suche ich immer noch nach einer Zoom-Methode, die alle Steuerelemente, Schrift… vergrößert.

Für Hilfe wäre ich sehr dankbar!

Mfg Sebastian

Moien

  • einen JToggleButton dafür zu verwenden und ob es irgendwie
    möglich ist ihn zu überschreiben oder überzumalen

Ja, aber du wirst nicht damit glücklich werden. Das Übermalen macht man durch überschreiben der paint()-Methode (oder man setzt halt Icons).

  • von AbstractButton etwas Eigenes zu erzeugen.

Das ist sinnvoller. Allerdings bietet Abstractbutton relativ wenig Funktion, man könnte das Ding auch durch was komplett selbst gebautes ersetzen.

Die grosse Frage ist halt ob das ganze mit swing zusammenspielen muss oder nicht. Wenn es mit swing als Layouter gehen soll wäre Togglebutton das beste.

Außerdem suche ich immer noch nach einer Zoom-Methode, die
alle Steuerelemente, Schrift… vergrößert.

Vergiss swing und geht zu was komplett selbst gebautem über. swing zoomen ist die Hölle.

cu

Zoom?!
Hallo,

Außerdem suche ich immer noch nach einer Zoom-Methode, die
alle Steuerelemente, Schrift… vergrößert.

was genau verstehst du unter dem Zoom? Willst du nur die Schriftgröße ändern, z.B. weil du eine sehr hohe Auflösung verwendest und deine Menü-Schriftart usw. dann ziemlich klein ist?

Dies ist relativ einfach getan, indem du die Font-Werte im UIManager durchgehst und erhöhst.

Oder willst du einen stufenlosen Zoom wie wenn du in einer Detailansicht immer mehr vergrößerst? Dann wird dies, so wie pumpkin schon erwähnt hat, sicherlich aufwändiger.

Ciao, Bill

Vielen Dank erstmal!

Ich weiß, die Lösung mit dem JToggleButton ist nicht die beste. Ich hab sie trotzdem gewählt, weil es nur ein kleines Informatikprojekt von unserem Differenzierungskurs ist. Da werden jetzt Icons geladen - nur das große Problem ist das ich beim Icon den vollen Pfad angeben muss:
new ImageIcon(„C:/Java/MeinToggleButton/T_an.gif“)
Wie mach ich das im Internet? - mit http:///T_an.gif geht
das nicht, dass habe ich schon ausprobiert. Auch new ImageIcon(new URL(…)) funktioniert nicht.

Mfg Sebastian

PS:smiley:ie Zoom-Funktion, die alles vergrößert ist nicht so wichtig - aber mein Informatiklehrer sprach mich darauf an.

Moien

Wie mach ich das im Internet?

Mit einem Dateinamen ohen Sonderzeichen. Nur a…Z0…9, kein _.

Auch new
ImageIcon(new URL(…)) funktioniert nicht.

Das wäre jetzt mein Ansatz gewesen.

Man kann übrigens die gif’s auch in die jar-Datei mit reinpacken. Dann sind sie mit relativen Pfad ansprechbar. Das wäre die beste Lösung (nur eine Datei runterladen vs alle Icon einzeln nachladen).

cu

Vielen Dank,

mit der Zoommethode sollen alle Steuerelemente (also Button,Label) und Graphics-Elemente etc. vergrößert werden. Z.B. soll der Schaltplan, der auf dem Programm angezeigt wird vergrößert werden. -> Es ist also mit sehr viel Arbeit verbunden.
Aber die Zoom-Methode ist nur nebensächlich. Ich suche eher eine Möglichkeit Icons im Internet zu laden (siehe Re^2: Wichtig! - 2.Frage).

Mfg Sebastian

Hallo,

vielen Dank für die schnelle Hilfe!

Mfg Sebastian

PS: ImageIcon(new URL(…)) funktionierte doch - es muss wohl etwas anderes gewesen sein, dass die Exception gesendet hat.

Zum Zoom-Problem:

Prinzipiell ist die möglich, allerdings ist das relativ kompliziert. Wenn alle zu zoomen Objekte in einem Container sind (z.B. JPanel), kann man eine Unterklasse davon konstruieren und muss hier die paint-Methode überschreiben. Der Trick dabei ist es dann auf das Graphics Objekt eine Transformation anzuwenden, die den Zoomfaktor einstellt und dieses dann auch für alle Komponenten verwenden.

public void paint(Graphics g) {
Graphics2D currentGraphics = (Graphics2D) g;
AffineTransform t = currentGraphics.getTransform();
if (t.getScaleX() != zoomFactor) {
AffineTransform nT = new AffineTransform(t);
AffineTransform scale = new AffineTransform();
scale.setToScale(zoomFactor, zoomFactor);
scale.preConcatenate(nT);
currentGraphics.setTransform(scale);
}
… und ab hier dann paint mit dem angepassten Grahics Objekt weiter abarbeiten.
}

Probleme dabei:
–> RepaintManager muss teilweise manuell aufgerufen werden, damit die View wirklich vernünftig aktualisiert wird, anscheinend werden beim einfügen einer Trasnformation nicht alle Regionen als dirty markiert
–> Probleme mit der DoubleBuffer Strategie, bei manchen Grafiktreibern führt dies dazu, dass ein Teil des sichtbaren Bildes dafür verwendet wird, in dem Fall kann man dies explizit ausschalten:
RepaintManager.currentManager(this).setDoubleBufferingEnabled(false);
in einigen Fällen hilft auch das setzen der Variable „swing.volatileImageBufferEnabled“ auf false (java -D…).

Das ganze ist aber wie gesagt nicht einfach, ich habe selber so eine Anwendung für das Layouten von Formularen entwickelt, bei der man das Layout wie in einem normalen Textverarbeitungsprogramm vergrössern und verkleinern kann. Es gibt hier keine schnelle Lösung, sondern man muss sich hier einarbeiten.