Transparenz

Rainbow

Bekanntes Mitglied
Hi,
ich arbeite mit den AWTUtilities, um quasi ein rundes Fenster hinzubekommen.
Mein problem dabei ist jedoch das das total unschön aussieht.

Java:
AWTUtilities.setWindowShape(meinWindow, meinShape);

so schneid das ja ab, meinShape ist dabei eine Ellipse2D.Double.
Aber ich möchte gerne, das das alles eine Linie aussen herum ist und momentan sieht man halt jeden Pixel...gibt es eine Möglichkeit, das ich irgendwie einen schönen geraden Kreis hinbekommen ohne die Ecken und Kanten zu sehen?
...wenn man drawOval macht siehts ja auch schön rund aus.

Liebe Grüße
 

Landei

Top Contributor
Keine Ahnung, ob das hilft, aber du könntest versuchen, die RenderingHints auf Antialiasing zu setzen:

Java:
//Für AWT-Komponente
public void paint(Graphics g) {
   antialiasing(g);
   super.paint(g);
}
//Für Swing-Komponente
public void paintComponent(Graphics g) {
   antialiasing(g);
   super.paintComponent(g);
}
private antialiasing(Graphics g) {
   ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
}

[edit]
Hier sind weitere Einstellungen, mit denen du das Zeichnen beeinflussen kannst:
Controlling Rendering Quality (The Java™ Tutorials > 2D Graphics > Advanced Topics in Java2D)
 
Zuletzt bearbeitet:

njans

Top Contributor
Ich möchte dieses Thema mal wiederbeleben, denn ich suche ebenfalls nach eine guten Möglichkeit ein rundes Fenster zu glätten.
Offen für Ideen und Lösungen :)
 

njans

Top Contributor
Ja, da hatte ich schon geschaut. Auch die Referenzen auf der Seite habe ich mir angeschaut.
Nun habe ich jedoch nichts funktionierendes gefunden, was die harten Kanten von ShapedWindos verschwinden lässt.
Und das ist ja äußerst schade.
Vielleicht hat jemand ein explizites codeschnipsel oder einen Link zu ner Lösung?
Im Anhang kann man wunderbar sehen, wie hart die Kanten auf einen weißen Desktop aussehen.
 

Anhänge

  • SHOW.png
    SHOW.png
    5,8 KB · Aufrufe: 24
Zuletzt bearbeitet:

njans

Top Contributor
Genau den hatte ich auch getestet nur so, wie es da beschrieben steht, funktioniert es definitiv nicht.
Vielleicht mache ich da ja auch nur was falsch, aber das würde mich an der Stelle wundern, denn wenn das Überschreiben von paintComponent mit dem Beispiel genauso wenig funktioniert wie das Überschreiben von paint, dann weiß ich nicht, wo da der Fehler liegen sollte.
 
Zuletzt bearbeitet:

Rainbow

Bekanntes Mitglied
Das hab ich persönlich noch nicht getestet..ich probier das mal heute Abend aus und wenn es klappt, dann schreib ich das nochmal so wie ichs gemacht hab.
 

Ariol

Top Contributor
Bei mir funktioniert die Verwendung von SrcAtop. Hier mal ein Minimalbeispiel:
Java:
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class CircleTest {

	public static void main(String[] args) {
		JFrame f = new JFrame();
		JPanel p = new JPanel(){
			protected void paintComponent(Graphics g) 
			{
				// Clear the background to black
				g.setColor(Color.BLACK);
				g.fillRect(0, 0, getWidth(), getHeight());

				// Create a translucent intermediate image in which we can perform
				// the soft clipping
				GraphicsConfiguration gc = getGraphicsConfiguration();
				BufferedImage img = gc.createCompatibleImage(getWidth(), getHeight(), Transparency.TRANSLUCENT);
				Graphics2D g2 = img.createGraphics();

				// Clear the image so all pixels have zero alpha
				g2.setComposite(AlphaComposite.Clear);
				g2.fillRect(0, 0, getWidth(), getHeight());

				// Render our clip shape into the image.  Note that we enable
				// antialiasing to achieve the soft clipping effect.  Try
				// commenting out the line that enables antialiasing, and
				// you will see that you end up with the usual hard clipping.
				g2.setComposite(AlphaComposite.Src);
				g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
				g2.setColor(Color.WHITE);
				g2.fillOval(getWidth()/4, getHeight()/4, getWidth()/2, getHeight()/2);

				// Here's the trick... We use SrcAtop, which effectively uses the
				// alpha value as a coverage value for each pixel stored in the
				// destination.  For the areas outside our clip shape, the destination
				// alpha will be zero, so nothing is rendered in those areas.  For
				// the areas inside our clip shape, the destination alpha will be fully
				// opaque, so the full color is rendered.  At the edges, the original
				// antialiasing is carried over to give us the desired soft clipping
				// effect.
				g2.setComposite(AlphaComposite.SrcAtop);
				g2.setPaint(new GradientPaint(0, 0, Color.RED, 0, getHeight(), Color.YELLOW));
				g2.fillRect(0, 0, getWidth(), getHeight());
				g2.dispose();

				// Copy our intermediate image to the screen
				g.drawImage(img, 0, 0, null);

			};
		};
		f.add(p);
		f.pack();
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	
}
 

njans

Top Contributor
Ariol du hast wohl den Thread nicht ganz gelesen :D
Ein Bild zu zeichnen und das dann mit nem RenderingHint zu smoothen ist auch kein Problem.
AWTUtilities.setWindowShape(meinWindow, meinShape);

Das resultierende Window soll gerundete Ecken haben.
 

njans

Top Contributor
Ja das sieht auch okay bei RoundRectangle aus, aber ne Ellipse sieht so aus, wie mein Anhang.
Und das ist ja furchtbar! Also ich denke mal schon, dass ich an dem Beispiel code einfach was falsch mache, soll ja anscheinend direkt mit dem setWindowShape im Zusammenhang stehen aber ich habe keine Ahnung, was ich da falsch machen ^^
 

Rainbow

Bekanntes Mitglied
Also mein Problem, als ich das Thema gestartet hab war ja, das der innere Kreis zwar schön abgerundet ist...aber das, was ich abschneide eben nicht. Das sieht einfach nicht schön gerundet aus...da helfen die Links auch nicht weiter.
Also genau das, was dieser Teil macht:
Java:
		if((AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.TRANSLUCENT))) {
			AWTUtilities.setWindowShape(_dialog, createShape());
		}
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    1,9 KB · Aufrufe: 27
Zuletzt bearbeitet:

Landei

Top Contributor
Erinnert mich an Salvodor Dali:

Spiegelei%20ohne%20Teller,%201932.jpg

Spiegelei ohne Teller
 

Ariol

Top Contributor
Versuchs doch mal so:
Shape dein Window als Kreis. Ein paar Pixel größer als er eigentlich sein sollte.
Setze den Hintergrund auf transparent.
Zeichne darauf einen Kreis, der nicht bis zu Rand des Windows geht (entsprechend mit Antialiasing und Co).

Damit sollte das sichtbare einen glatten Rand bekommen.
So ähnlich ist das auch in dem Beispiel gemacht.
 

njans

Top Contributor
Witzig! Als ich heute nen Kommilitonen gefragt habe, hatte er die selbe Idee, deswegen habe ich das auch schon getestet und kann sagen: Es geht!
Hier mal mein Code :)

setWindowOpaque ist wichtig, damit das ganze Fenster auch als Transparent angezeigt werden kann.
Java:
AWTUtilities.setWindowShape(this, new Ellipse2D.Double(0, 0, this.getWidth(), this.getHeight()));
AWTUtilities.setWindowOpaque(this, false);

Die Seize habe ich hier um 4 Pixel verkleinert, da einer dann doch leicht ekig war. So bekommt man einen deutlich runderen Kreis!
Java:
// Set the size to a smaller value to give the antialiasing a little space 
		int width = this.getWidth() -4;
		int height = this.getHeight() -4;

		// Create a new graphics object to fill the background with a transparent color
		Graphics2D graph = (Graphics2D)g.create();
		graph.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 0f));
		graph.fillRect(0, 0, this.getWidth(), this.getHeight());
		
		// Create a new graphics object that paints on a BufferedImage
		GraphicsConfiguration gc = ((Graphics2D)g).getDeviceConfiguration();
		BufferedImage img = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
		Graphics2D graph2 = img.createGraphics();
		
		// Set the renderingHint to create a smooth oval
		graph2.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
		
		// *******************************************************
		// Draw as you like in this section
		
		graph2.setColor(Color.black);
		graph2.fillOval(0,0, width, height);
		
		// *******************************************************
		// Set the composite back to visible and than draw the BufferedImage onto the translucent background
		graph.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
		graph.drawImage(img, 2, 2, null);
		
		// Dispose of the used grapic objects
		graph.dispose();
		graph2.dispose();
 

Anhänge

  • SHAPE2.png
    SHAPE2.png
    4,7 KB · Aufrufe: 30
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
B Bild bearbeiten mit Transparenz (spiegeln, Farben austauschen) AWT, Swing, JavaFX & SWT 8
S Images färben und transparenz ändern AWT, Swing, JavaFX & SWT 4
Luk10 Transparenz von ARGB ints AWT, Swing, JavaFX & SWT 5
C Java2D Transparenz geht bei einfärben verloren AWT, Swing, JavaFX & SWT 7
B Swing Cursor-Transparenz AWT, Swing, JavaFX & SWT 2
C 2D Simulation möglichst effizient (ggf. Transparenz) AWT, Swing, JavaFX & SWT 23
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
O Transparenz mit AWTUtilities aber nur das Fenster nicht die Buttons AWT, Swing, JavaFX & SWT 8
R Transparenz mit AWTUtilities AWT, Swing, JavaFX & SWT 6
J Swing Transparenz bei Swingelementen AWT, Swing, JavaFX & SWT 2
V [SWT] Shell transparenz AWT, Swing, JavaFX & SWT 3
T Pseudo-Transparenz für Applets -> Background grabben AWT, Swing, JavaFX & SWT 15
H Einzelne Pixel auf Transparenz überprüfen? AWT, Swing, JavaFX & SWT 3
D Label und Transparenz . AWT, Swing, JavaFX & SWT 4
T Transparenz mit SWT AWT, Swing, JavaFX & SWT 7
T Transparenz bei Graphics AWT, Swing, JavaFX & SWT 9
P 2 Probleme mit Panel: index setzten und transparenz AWT, Swing, JavaFX & SWT 4
A Transparenz ? AWT, Swing, JavaFX & SWT 13
E transparenz (alpha) - komisches aussehen von textfeldern! AWT, Swing, JavaFX & SWT 2
L Transparenz Problem mit verschiebung AWT, Swing, JavaFX & SWT 8
G png und Transparenz AWT, Swing, JavaFX & SWT 4
F JWindow mit einem Bild und Transparenz AWT, Swing, JavaFX & SWT 4
F Problem mit Transparenz, MouseEvents und Performance AWT, Swing, JavaFX & SWT 3
M Hintergrundbild und grafischer Button (Transparenz Probleme) AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben