Graphics oder Graphics2D Zeichenmöglichkeit gesucht?

vrcat

Mitglied
Hallo zusammen,

ich suche gerade eine Möglichkeit mit der ich die Farbeinstellungen des Graphics-Context verändern kann.
Ziel dabei ist normal zu zeichnen mit den von Graphics gegebenen Zeichenfunktionen. Jedoch soll es möglich sein das nach einer Einstellung alles etwas heller gezeichnet wird als wie der eigentliche Farbton der durch g.setColor() eingestellt ist.

Ich hoffe ihr könnt mir da weiter Helfen habe es schon mit setComposit() versucht jedoch verknüpft er die Zeichenoperation mit dem Untergrund so soll es nicht sein.

g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, 0.3f));

HILFE …
Mfg
vrcat
 
Nimm doch einfluss auf den Alpha Kanal, das kannst du auch mit setColor machen
Code:
.....setColor(new Color(255,0,0,50)) //für Rot mit Alpha 50
Mit freundlichen Grüßen

elmato
 
Erstmal schönen Dank für deine Antwort. Jedoch ist durch die Verwendung des Alpha Kanals der Hintergrund Transparent, dass sollte ja nicht passieren. Ein weiteres Problem ist sobald man wieder mit setColor() eine neu Farbe setzt ist dies 100% sichtbar. Es sollte so sein das ich einmal etwas setzte und dann die Folgenden Farbwerte sich entsprechend verhalten.

mfg vrcat
 
Ich Verstehe dich jetzt nicht so ganz, definiere doch eigene Farben in dem Farbton den du gerne haben möchtest? Oder möchtest du zwei Farbtöne übereinanderlegen?
 
Also ich habe eine abstrakte Superklasse „Shape“ für meinen Graphen. Alle Elemente die von dieser Klasse abgeleitet sind müssen eine Methode „paintShape“ implementieren. In dieser Methode kann man festlegen wie das „Shape“ auszusehen hat inklusive Farben (durch einfache Zeichenmethoden der Graphic-Instanze).
Nun möchte ich gerne allgemein, also in der abstrakte Superklasse „Shape“ festlegen, dass alle Kinder dieser Klasse sich etwas Blasser darstellen, sollten sie Selektiert sein, ohne das das in den Kindern extra beachtet werden muss.

Mit freundlichen Grüßen
vrcat
 
Ui, so ein ähnliches Problem hatte ich neulich auch ich wollte Rechtecke anklickbar machen, bzw auf ein MouseEntered Event reagieren, hat nicht so wirklich geklappt, wenn man das mit dein Code machen könnte wäre ich dior dankbar wenn du ihn hier Posten könntest da es mich interessieren würde..
Ansonsten kann ich dir höchstens etwas theoretische Hilfe geben, so wie ich mir das Vorstelle, muss deine Abstrakte Klasse dann wohl einen MouseListener implementieren der auf einen Click reagiert und dann kannst du imho schon mir Alpha arbeiten, da es durch die Transparenz ja auch heller wird...
mfg
elmato
 
Hallo elmato,

also Rechtecke die du Gezeichnet hast kannst du nicht mir einem MouseListener verwenden wenn es doch gehen sollte wüste ich nicht wie da diese ja keine Instanze haben. Wenn du das mit dem MouseListener machen möchtest könntest du es mit eigenen Componenten machen.

z.B. JComponent dort die Paint-Methode selbst Implementieren also ein Rechteck drauf zeichnen mit getDimension() von der Komponente dann kannst da auch mit MouseListenern was machen.


Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Selector extends JFrame {
	
	class SelectableRec extends JComponent implements MouseListener {
		
		public SelectableRec(Rectangle r){
			setBounds(r);
			setBackground(Color.BLUE);
			addMouseListener(this);
		}
		
		public void paint(Graphics g){
			Graphics2D g2 = (Graphics2D)g;
			g2.setColor(getBackground());
			g2.fillRect(0,0,getSize().width,getSize().height);
		}

		public void mouseClicked(MouseEvent 	e) {
			setBackground(Color.YELLOW);
			repaint();		
		}

		public void mouseEntered(MouseEvent 	e) {
			setBackground(Color.RED);
			repaint();
		}

		public void mouseExited(MouseEvent 		e) {
			setBackground(Color.BLUE);
			repaint();		
		}

		public void mousePressed(MouseEvent 	e) {
			// TODO Auto-generated method stub			
		}

		public void mouseReleased(MouseEvent 	e) {
			// TODO Auto-generated method stub			
		}	
	}	
	
	public Selector(){
		setTitle("Selector - Test");
		setSize(new Dimension(800,600));
		
		getContentPane().setLayout(null);
		getContentPane().setBackground(Color.WHITE);
		
		for (int x = 10;x < 800;x+=110)
			for (int y = 10;y < 600;y+=110){
				Rectangle r = new Rectangle(x,y,100,100);
				getContentPane().add(new SelectableRec(r));				
			}
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setExtendedState(MAXIMIZED_BOTH);
		setVisible(true);
	}

	public static void main(String[] args) {
		new Selector();
	}
}

Persönlich finde ich diese Lösung nicht so gut da ich einen Graphen habe der Extrem goss werden kann mit biss zu 10.000 Shapes und ich auch noch eine Zoom-Funktion benötige habe ich eine so wie du es wahrscheinlich auch gemacht hast normal Rechtecke auf den Context gezeichnet. Die Daten des Rechtecks habe ich dann in einem Tree gespeichert. Somit brauch ich nur einen MouseListener der von dem Panel realisiert wird auf dem ich Zeichne und bei jedem Klick durchsuche ich den Baum nach einem Treffer geht super schnell.

Treffer wenn ein Kein weiterer Knoten die Bedingung

if (bounds. inside (p.x,p.y)) erfüllt. (inside wird schon von Rectangle Implementiert)

Ich hoffe ich konnte dir ein wenig helfen, dein Vorschlag mit dem Alpha-Kanal habe ich schon probiert geht leider nicht da der Hintergrund immer mit einbezogen wird.

mfg vrcat
 
Danke für den Code, ich hatte damals versucht von Rechteck abzuleiten und dann die Methoden die ich brauchte zu implementieren, ich hab's dann aber anders gelöst, aber ich schau mir mal dein Beispiel an nochmals danke und wenn mir nochwas einfällt für dein Problem melde ich mich...
mfg elmato

/edit
schau dir mal unter http://www.java2s.com/ die 2d/3d BEispiele an, vielleicht findest du da was du suchst..
 
Zuletzt bearbeitet:
Zurück