SWT Linie unter transparentes Canvas zeichnen

glynx

Mitglied
Moin

Ich bin jetzt seit 5 Stunden am Suchen und langsam irgendwie verzweifelt...ich habe für die Gui an der ich aktuell arbeite ein neues Widget (abgeleitet von einem Canvas) implementiert, welches einige Sachen drawt usw. Bei ihnen allen ist als Style gesetzt SWT.NO_BACKGROUND

Von den Widgets gibts es mehrere auf der Shell, die durch ein GridLayout angeordnet werden.
Auf der Shell habe ich nun noch einen PaintListener implementiert, der beim PaintEvent Linien zeichen. Die Start- bzw. Endpunkte dieser Linien sind abhängig von den Widgets und sollen auch unter diesen hindurch / auf diesen drauf verlaufen. Quasi werden die gemalten Elemente der Widgets durch diese Linien verbunden, bzw. es sollte so sein.
Problem ist leider, dass die Linien auf der Shell hinter den Widgets nicht angezeigt werden, auch wenn diese keinen Hintergrund haben sollten.
Wenn ich nun einen Button verwende, der die Visibility der widgets toggelt, dann sind die Linien nach unsichtbar und wieder sichtbar machen komischerweise richtig da.

Gibt es da eine Möglichkeit diesem Problem aus dem Weg zu gehen oder dies zu lösen? Mir fehlen mittlerweile echt die Ideen was ich noch machen kann.

Im Folgenden Ausschnitte des Codes:

Widget
Java:
public class MatchWidget extends Canvas {

    public MatchWidget(Composite parent, ...) {
	super(parent, SWT.NO_BACKGROUND);

	GridData gd = new GridData();
	gd.horizontalAlignment = GridData.FILL;
        ...GridData einstellen...
	this.setLayoutData(gd);
	
	addPaintListener(new PaintListener() {
	    public void paintControl(PaintEvent e) {
		paint(e);
	    }
	});
    }

    private void paint(PaintEvent e){
	GC gc = e.gc;
	...male Widget...
	gc.dispose();
    }
    ...sonstige Methoden, nicht relevant...
}

Main
Java:
public class Main implements PaintListener, SelectionListener {
	private Display display;
	private Shell shell;
	Button b;
	...

	Main() {
		display = new Display();
		shell = new Shell(display);
		shell.setText("Blubb");
		shell.addPaintListener(this);
		createGUI();
		shell.setSize(1000, 1000);
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		
	}
       
        private void createGUI() {
            ...erstelle tolle widgets usw...
        }
       
        @Override
	public void widgetDefaultSelected(SelectionEvent e) {
             
	}

	@Override
	public void widgetSelected(SelectionEvent e) {
	...handle selection events...

	}

	public void paintLines(PaintEvent e) {
		GC gc = e.gc;
                ...verschiedene Linien mit gc.drawLine zeichnen...

	}

	@Override
	public void paintControl(PaintEvent e) {
		paintLines(e);
	}

Sry, ich habe aber mal diverse Sachen entfernt, die hier nicht von Belang sind, sodass man sich nur etwas vorstellen kann, wie der Code so aussehen soll.

MfG Glynx
 

glynx

Mitglied
Mittlerweile habe ich auf jeden Fall festgestellt, dass folgendes komisches Verhalten auftritt:
Im Hintergrund scheint der bereits gepaintete Inhalt des Widgets erhalten bleiben und der neue wird wohl nur rübergepaintet...was ich für komisch halte ist, dass am Ende der Paint-Methode des MatchWidgets eigentlich die:
gc.dispose();
getParent().redraw();

aufgerufen werden, sodass eigentlich der Kram komplett disposed werden sollte, nachdem es gedrawt wurde.
Evtl. liegt dabei ja auch der Fehler, nur komm ich da aktuell iwie net drauf.

MfG Glynx
 

Wildcard

Top Contributor
1. gc.dispose() musst du zwar aufrufen, es hat aber keinen Einfluss auf das was schon gezeichnet wurde, die Linien verschwinden dadurch also nicht
2. Wenn du NO_BACKGROUND angibst, dann bist du dafür verantwortlich die Client Area zu übermalen. Wenn du das nicht willst, dann lass einfach das NO_BACKGROUND weg. parent.redraw() bringt da auch wenig, denn der Parent braucht sich selbst nicht zu zeichnen wo er von Children überdeckt wird. Wenn dein Widget also einen bestimmten Bereich des Parents überdeckt, das NO_BACKGROUND bit gesetzt ist und das Widget es versäumt seine Bildartefakte selbst zu bereinigen, dann bleiben die Artefakte solange erhalten bis sie vom Betriebssystem übermalt werden (minimieren, oder ein anderes Fenster wird über dein Fenster gezogen).
 

Wildcard

Top Contributor
Übrigens, falls das nicht klar geworden ist, NO_BACKGROUND hat absolut nichts mit transparenz zu tun, es gibt nur an ob das Widget automatisch die Client Area bei jedem repaint mit der Background Color übermalt, oder nicht.
Steht auch ganz klar in der API:
By default, before a widget paints, the client area is filled with the current background. When this style is specified, the background is not filled, and the application is responsible for filling every pixel of the client area. This style might be used as an alternative to "double-buffering" in order to reduce flicker. This style does not mean "transparent" - widgets that are obscured will not draw through.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX Diagonale Linie nicht ausgegeben/angezeigt AWT, Swing, JavaFX & SWT 1
G Linie mit der Maus auswählen AWT, Swing, JavaFX & SWT 5
G JavaFX Line Chart mit Farbverlauf/Gradient in Linie AWT, Swing, JavaFX & SWT 1
L 2D-Grafik Linie von Kreis zu Kreis AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Linie wird nach Mausklick nicht am richtigen Ort gezeichnet AWT, Swing, JavaFX & SWT 11
K JavaFX Linie immer in der Mitte der Szene halten AWT, Swing, JavaFX & SWT 12
L JavaFX Horizontale Linie zur Scene binding AWT, Swing, JavaFX & SWT 3
3 2D-Grafik BasicStroke dash pattern - Linie zu lang!? AWT, Swing, JavaFX & SWT 1
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
javampir Kubische Interpolation einer Linie AWT, Swing, JavaFX & SWT 5
C AWT Horizontale Linie in einem Panel AWT, Swing, JavaFX & SWT 12
B Linie zwischen 2 Elementen AWT, Swing, JavaFX & SWT 5
propra Auf einem JPanel gezeichnete Linie auswählen AWT, Swing, JavaFX & SWT 3
Gossi 2D-Grafik Linie erweitern? AWT, Swing, JavaFX & SWT 10
V Linie mit Länge und Bogenmaß AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Linie hat Löcher AWT, Swing, JavaFX & SWT 10
P 2D-Grafik Neue Farbe für einen Teilbereich einer Linie? AWT, Swing, JavaFX & SWT 8
K 2D-Grafik Linie verschwindet beim Zeichnen AWT, Swing, JavaFX & SWT 10
I Schrift und Farbe formatieren, und zwar pro Linie... AWT, Swing, JavaFX & SWT 4
C Swing JTable: Horizontale Linie bei einzelnen Zellen ausblenden AWT, Swing, JavaFX & SWT 5
B SWT Linie soll in Abhängigkeit der aktuellen Uhrzeit gezeichnet werden AWT, Swing, JavaFX & SWT 16
M Labels in ScrollPane mit Linie verbinden AWT, Swing, JavaFX & SWT 2
R JPanel - zeichnen in skalierten Bereich - Linie (X-Achse) nicht sichtbar AWT, Swing, JavaFX & SWT 11
J Swing - ich sehe keine Linie, andere schon AWT, Swing, JavaFX & SWT 6
S JXTaskPane und gepunktete Linie AWT, Swing, JavaFX & SWT 2
G SWT Linie AWT, Swing, JavaFX & SWT 13
F Rahmen mit gestrichelter Linie zeichnen AWT, Swing, JavaFX & SWT 4
G Linie nach Höhe einer Zahl zeichnen? AWT, Swing, JavaFX & SWT 3
M Linie zwischen JComponents AWT, Swing, JavaFX & SWT 5
T Linie langsam zeichnen AWT, Swing, JavaFX & SWT 3
L Linie mit drawLine auf JPanel AWT, Swing, JavaFX & SWT 7
A gezeichnete Linie verschwindet, wenn ich JMenuBar öffne AWT, Swing, JavaFX & SWT 2
S Problem mit dem Zeichnen einer Linie auf einem JPanel AWT, Swing, JavaFX & SWT 30
TheJavaKid Kreis, Rechteck, Linie. verschieben AWT, Swing, JavaFX & SWT 5
Student "Dicke" einer Linie - Line2D.Double AWT, Swing, JavaFX & SWT 12
R drawLine gibt hässliche linie AWT, Swing, JavaFX & SWT 4
T Vertikale Linie abgeschnitten AWT, Swing, JavaFX & SWT 2
C Linie in einem JLabel AWT, Swing, JavaFX & SWT 14
G linie / vektor zeichnen AWT, Swing, JavaFX & SWT 2
K Linie wird falsch auf Panel gezeichnet AWT, Swing, JavaFX & SWT 11
M JButtons mit Linie verbinden AWT, Swing, JavaFX & SWT 4
MiMa JavaFX JAR unter Windows ausführen schlägt fehl? AWT, Swing, JavaFX & SWT 5
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
U Wie funktioniert das rotieren unter 2dGraphics, also wie stelle ich z. B. 90° ein? AWT, Swing, JavaFX & SWT 1
T Swing DPI-Skalierung und Java 2D unter Java 11 (und Windows 10) AWT, Swing, JavaFX & SWT 2
N JavaFX Installation unter IntelliJ IDEA AWT, Swing, JavaFX & SWT 5
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
B JavaFX openjfx11: intelliJ unter Ubuntu 18.10 kann nicht auflösen AWT, Swing, JavaFX & SWT 4
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
S Kein JFrame unter Mac? AWT, Swing, JavaFX & SWT 8
Blender3D Swing KeyBoardListener funktioniert nicht unter UBUNTU AWT, Swing, JavaFX & SWT 7
V Swing Button soll unter anderem Button sein AWT, Swing, JavaFX & SWT 2
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
L JavaFX Scene wechseln unter FX AWT, Swing, JavaFX & SWT 5
Avarion Swing JFrame unter Windows 10 kleiner ?! AWT, Swing, JavaFX & SWT 2
T ThreadPool sicher beenden unter Verwendung von swt.widgets.Display.syncExec AWT, Swing, JavaFX & SWT 1
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
M Swing Bildbearbeitung unter Java AWT, Swing, JavaFX & SWT 22
S (Swing)Vollbild anzeigen unter Linux/Mac AWT, Swing, JavaFX & SWT 6
D 2D-Grafik Rechteck befindet sich unter dem Rahmen des JFrame. AWT, Swing, JavaFX & SWT 1
T JFrame Icon unter Linux/Ubuntu AWT, Swing, JavaFX & SWT 11
S JMenu unter JPanel versteckt AWT, Swing, JavaFX & SWT 5
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
SexyPenny90 JLabel liegt unter meiner Turtle AWT, Swing, JavaFX & SWT 5
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
J AWT setBackground(Color.orange) ist unter Win7 Aero nicht orange AWT, Swing, JavaFX & SWT 3
T Unter JPanel liegende Komponenten "totschalten" AWT, Swing, JavaFX & SWT 5
R Problem mit TrayIcon unter Windows/Linux AWT, Swing, JavaFX & SWT 7
M Datei Speichern unter Dialog - SWT AWT, Swing, JavaFX & SWT 3
T JButtons indexiert unter NetBeans anlegen AWT, Swing, JavaFX & SWT 7
S GUI aussehen unter Windows und Linux (und Mac) AWT, Swing, JavaFX & SWT 13
J Applet Kommunikation unter Applets AWT, Swing, JavaFX & SWT 2
I Probleme mit GWT Controls unter Firefox AWT, Swing, JavaFX & SWT 14
A Swing Probleme unter Windows 7 AWT, Swing, JavaFX & SWT 5
F AWT MouseMotionListener e.getButton() ist immer 0 unter Linux und Windows AWT, Swing, JavaFX & SWT 6
F AWT DnD von Dateien mit Sonderzeichen funktioniert unter Linux nicht AWT, Swing, JavaFX & SWT 3
J Swing Natives Menü unter OS X erstellen ? AWT, Swing, JavaFX & SWT 8
C Swing Kleines Programm mit SWING unter Verwendung von MVC AWT, Swing, JavaFX & SWT 5
G SWT-App läuft nicht unter OSX, unter Win aber problemlos AWT, Swing, JavaFX & SWT 3
H Y-Position mit get-/setLocation() unter Linux/Enlightement16 inkonsistent AWT, Swing, JavaFX & SWT 3
M KeyListener Problem unter Firefox AWT, Swing, JavaFX & SWT 2
G Quaqua unter Windows AWT, Swing, JavaFX & SWT 15
B LaF unter KDE AWT, Swing, JavaFX & SWT 2
SuperSeppel13 Swing Fehlende Komponenten unter Mac OS X AWT, Swing, JavaFX & SWT 8
M Swing GroupLayout unter Java 1.5 AWT, Swing, JavaFX & SWT 20
M JMenu teilweise unter einer JComponent AWT, Swing, JavaFX & SWT 4
B Button identifizieren unter MouseEvent AWT, Swing, JavaFX & SWT 7
L JPanel mit Objekten selektieren wie unter Windows / Ubuntu AWT, Swing, JavaFX & SWT 4
W WindowsLookAndFeel unter Mac AWT, Swing, JavaFX & SWT 5
A Swing LAF unter Windows: javax.swing.DebugGraphics cannot be cast to java.awt.Graphics2D AWT, Swing, JavaFX & SWT 5
N JDesktop unter Linux AWT, Swing, JavaFX & SWT 4
C JComboBox funktioniert nicht unter Mac OS X AWT, Swing, JavaFX & SWT 2
P Swing [gelöst/erledigt] Gleicher Code läuft unterschiedlich unter Linux und Windows AWT, Swing, JavaFX & SWT 5
U Grafikkontext unter JButtons? AWT, Swing, JavaFX & SWT 5
M Probleme unter Linux AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben