setOpaque(true/false); Java
In Java2D wenn Sie setOpaque bin ich ein wenig verwirrt, was die wahre und falsche tut.
Zum Beispiel weiß ich, dass in Swing Undurchsichtig bedeutet, dass beim malen Swing nicht paint, was ist hinter der Komponente. Oder ist das hinten? Welches ist es?
Dank
InformationsquelleAutor | 2010-03-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort auf Ihre Frage ist, dass "undurchsichtig" ist definiert in Englisch als vollkommen nicht-transparent. Daher eine undurchsichtige Komponente ist eine, die Malt die ganze Rechteck, und jeder pixel ist nicht auf allen durchscheinend zu irgendeinem Grad.
Jedoch die Swing Komponente, die Deckkraft-API ist eine von jenen falsch ausgelegt und daher oft falsch verwendeten APIs.
Was wichtig zu verstehen ist, dass
isOpaque
ist ein Vertrag zwischen dem Swing-system und einer speziellen Komponente. Wenn es true zurück, wird die Komponente garantiert nicht durchscheinend Farbe jedes pixel der rechteckigen Bereich. Diese API sollte wurden abstrakte Kraft aller Komponente Schriftsteller zu betrachten. DieisOpaque
- API verwendet wird, durch Swing-Malerei-system, um zu bestimmen, ob der Bereich, der durch ein Bauteil muss lackiert werden für Komponenten, die überlappung und die dahinter, einschließlich der Komponente container und Vorfahren. Wenn eine Komponente gibt true zurück, zu dieser API, das Swing-system optimieren Gemälde zu malen, etwas in diesem Bereich bis zum Aufruf der jeweiligen Komponente die paint-Methode.Aufgrund vertraglicher Einbeziehung der
isOpaque
die APIsetOpaque
sollte nicht vorhanden, da ist es eigentlich falsch für etwas externes zu nennensetOpaque
da wiederum die äußere Ding kann nicht wissen, ob die Komponente in Frage (oder sogar können) zu Ehren. Stattdessen isOpaque haben sollte, wurde außer Kraft gesetzt, die von jedem konkreten Komponente, um zurückzugeben, ob es tatsächlich so ist, in der Tat, undurchsichtig bestimmten aktuellen Eigenschaften.Weil die
setOpaque
API hat existieren viele Komponenten mis-Implementierung (durchaus verständlicherweise) zu fahren, ob oder nicht, Sie malen Ihre "hintergrund" (zum Beispiel JLabel und JPanel-Füllung mit Ihrer Hintergrundfarbe). Der Effekt davon ist, erstellen Sie einen Eindruck mit Benutzer der API zu denken, dasssetOpaque
Laufwerke, ob oder nicht, der hintergrund sollte die Farbe, aber es funktioniert nicht.Außerdem, wenn, sagen wir, Sie möchten zu malen, ein JLabel mit einem durchscheinenden hintergrund, die Sie brauchen, um eine Hintergrundfarbe festzulegen, die mit einem alpha-Wert, und tun setOpaque(true), aber es ist nicht deckend - es ist durchscheinend; die Komponenten dahinter noch zu bemalen, damit die Komponente ordnungsgemäß gerendert.
Dieses problem wurde ausgesetzt in einer signifikanten Art und Weise mit der Java 6 ist die neue Nimbus Look & Feel. Es gibt zahlreiche Fehler-Berichte über transparente Bauteile Klage gegen Nimbus (siehe stack overflow Frage Java-Nimbus LAF mit transparentem text-Felder). Die Reaktion der Nimbus Entwicklungsteam ist diese :
So, in Zusammenfassung, sollten Sie nicht verwenden
setOpaque
. Wenn Sie es verwenden, beachten Sie, dass die Kombination von einigen Look & fühlen und einige Komponenten sind möglicherweise tun, "überraschende" Dinge. Und, am Ende, es gibt eigentlich keine richtige Antwort.Spät zur party hier, aber danke für die Erklärung der Beziehung zwischen isOpaque-und alpha-Kanal. Ich habe schon ratlos, weil Sie scheinen, um denselben Bereich -- es ist hilfreich zu wissen, dass ist, weil isOpaque ist doof. 🙂
Es ändern sollte, um so etwas wie
setPaintBackground(boolean)
....Oder ändern Sie die parameter ein float-Faktor von 0 bis 1, um den Grad der Opazität....0
ist transparent,1
ist nicht völlig.Die API müsste als veraltet markiert und ersetzt Sie mit etwas, richtig geskilled und
protected
.InformationsquelleAutor Lawrence Dol
javadoc sagt : Wenn true, wird die Komponente Malt jedes pixel innerhalb seiner Grenzen. Andernfalls wird die Komponente kann nicht malen einige oder alle Pixel, so dass die darunter liegenden Pixel zu zeigen, durch.
versuchen Sie dieses Beispiel-Programm zu...
http://www.java2s.com/Code/JavaAPI/javax.swing/JPanelsetOpaquebooleanisOpaque.htm
wenn true, werden die dahinterliegenden Komponenten sind nicht gezeigt.. wenn falsch, Ihr gezeigt.. wir brauchen keine siehe javadoc für diese, einem Englisch-Wörterbuch ist genug 🙂 🙂
Ja, dass ist das, was ich dachte, aber nach dem Lesen viele Dinge, die ich war immer verwirrt. Vielen Dank 🙂
InformationsquelleAutor raj
Ich denke, dass die folgenden muss Hinzugefügt werden:
Den Begriff undurchsichtig hat verschiedene Bedeutungen in Java 2D und Swing.
In Java 2D Opazität ist ein rendering-Konzept. Es ist eine Kombination
der alpha-Wert und die
Composite
- Modus. Es ist ein Maß, umdem die pixel die Farben gezogen werden sollten, gemischt mit pixel
Werte, die bereits vorhanden sind. Zum Beispiel, wir zeichnen ein semi-transparent
Rechteck über eine bestehende Ovale Form. Das oval ist daher
teilweise sichtbar. Dieses Konzept wird Häufig im Vergleich zu Licht
gehen Trog Glas oder Wasser.
In Swing, einer undurchsichtigen Komponente Malt jedes pixel in seine
rechteckigen Grenzen. Eine nicht-Opak-Komponenten-Lacken nur eine Teilmenge der
seine Pixel oder gar keine, so dass die Pixel darunter zu
zeigen, durch. Die opaque-Eigenschaft festgelegt wurde, aus Gründen der Effizienz; Swing
nicht zu malen, Bereiche hinter der opaken Bauteile.
Quelle: Java-docs und Filthy Rich Clients
Im code-Beispiel, wir haben zwei Komponenten. Die Komponente auf der linken Seite ist ein panel, das verwendet
AlphaComposite
zu malen, eine sehr durchsichtige Rechteck über ein oval. Die Komponente auf der rechten Seite ist ein label. Etiketten sind nicht deckend in den meisten look and feels. Wir überschreiben Sie die BezeichnungisOpaque()
Methode, um einen grauen hintergrund.InformationsquelleAutor Jan Bodnar