Kleine Panels auf einem großen Panel frei platzieren

Status
Nicht offen für weitere Antworten.
R

RedNifre

Gast
Hallo,

Ich habe gerade ein paar Probleme, eine GUI so hinzubiegen, wie ich sie gerne hätte. (Was GUIs betrifft bin ich Anfänger)

Das Ziel:
In der GUI ist eine große Fläche, auf die man per Mausklick Kreise setzen kann. Später soll man diese auch verschieben können.

Meine Idee:
Da man die Kreise später noch auswählen, verschieben, umfärben etc. können soll dachte ich mir, dass ich sie am besten als eigene Panels implementiere, die auf dem großen Hintergrundpanel liegen.

Die Probleme:
Man sieht nichts. :eek:/
Ich weiß auch nicht genau, an welcher Stelle im kleinen Panel der Code zum Zeichnen hin soll. Ich habe mal etwas Debug-Code in "paint", "repaint" und "paintComponent" geschrieben, aber anscheinend wird keine dieser Methoden aufgerufen.

Wie schaffe ich es, dass die kleinen Panels sagen wir mal 20x20 Pixel groß mit einem schwarzen Kreis in der Mitte angezeigt werden?
 
S

SlaterB

Gast
poste deinen bisherigen Code, dann kann man ihn zurechtbiegen,

von null auf oder in Textform alle relevanten Befehle aufzuführen ist nicht zielführend
 
R

RedNifre

Gast
Okay.
Um das Verständnis zu erleichtern hier noch ein paar Details: Das Programm soll ein Graph-Editor werden. Meine ursprüngliche Version bestand nur aus einem großen Panel, welches in einer riesigen Methode alles direkt gemalt hat, woraus der Graph, bestand, etwa so:

Code:
 [b]ALTER CODE[/b]
public class GPanel extends JPanel implements MouseListener {
	[...]
	public void paintComponent(Graphics comp) {
	[...]
			Graphics2D comp2D = (Graphics2D)comp;
	[...]
				comp2D.drawLine(
							(int)(offX+ squareSize*(sol.nodes.elementAt(e).getX() + SHADOWOFFSET)),
							(int)(offY+ squareSize*(sol.nodes.elementAt(e).getY() + SHADOWOFFSET)),
							(int)(offX+ squareSize*(sol.nodes.elementAt((e+1)%sol.nodes.size()).getX() + SHADOWOFFSET)),
							(int)(offY+ squareSize*(sol.nodes.elementAt((e+1)%sol.nodes.size()).getY() + SHADOWOFFSET))
					);
[...]

Weil mich diese Herangehensweise irgendwie in eine Sackgasse gebracht hat versuche ich es jetzt anders. Ich habe jetzt eine eigene Knotenklasse, die von JPanel erbt und deren Instanzen auf dem GPanel liegen sollen. Hier mal beide Klassen, wobei der Code noch ganz am Anfang steht.

Code:
public class GPanel extends JPanel {
	[...]
	public GPanel () {
		setLayout(null);
		
		
		Dimension d = new Dimension(100,100);
		setPreferredSize(d);
		setMinimumSize(d);  // soll es auf feste größe setzen
		setMaximumSize(d);
		

// ist vielleicht quatsch:
		insets = this.getInsets();
		this.setSize(300 + insets.left + insets.right,
		              125 + insets.top + insets.bottom);
		
		
		addMouseListener(new MouseListener() {

			public void mouseClicked(MouseEvent e) {
				// Problem: Can't click while moving the mouse (Windows)
				// use mousePressed instead
			
			}

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

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

			public void mousePressed(MouseEvent e) {
				System.out.println("Test");
				System.out.println("getX: "+e.getX() +"\ngetXOnScreen: "+e.getXOnScreen()
					+"\ngetY: "+	e.getY() +"\ngetYOnScreen: " +e.getYOnScreen());
				
				
				addNode(e.getX()<<4, e.getY()<<4); 
					
				
				
				//repaint();
				
				
			}

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

	[...]

	public void addNode(int nodeX, int nodeY) {
		Node newnode = new Node(nodeX,nodeY);
		
		
		//newnode.setBounds(10, 20, 30, 40);
		
		nodes.add(newnode);
		
		
		add(newnode);
		
		Dimension size = new Dimension(20,20);
		
		newnode.setBounds(25 + insets.left, 5 + insets.top, 20,20);
		
		validate();
		newnode.repaint();
		this.repaint();
		
	//	newnode.setBounds(10, 20, 30, 40);
	//	newnode.repaint();
	//	repaint();
		
		
		//insertComponent(newnode);
		
		
		//this.validate();
		
		
		//this.updateUI();
		//SwingUtilities.updateComponentTreeUI(this);
		
		
		
	
	}
	
}

In der Knoten-Panel-Klasse Node habe ich momentan nur einfache Debug-Messages in die Methoden paint, repaint und paintComponent geschrieben, welche aber nicht ausgegeben werden. Mir ist das Verhältnis dieser Methoden untereinander auch nicht klar. Wo sollte ich denn den Knoten-Zeichnen-Code am besten hinschreiben?
 
G

Gelöschtes Mitglied 9001

Gast
Hallo,

ich habe mir Deinen Code zwar noch nicht bis ins Detail angesehen, aber zumindest Deine letzte Frage kann ich beantworten:
Für eigene Zeichenoperationen wird die paint-Methode überschrieben. Dort hinein kommt Dein Zeichencode.
 
S

SlaterB

Gast
setBounds hilft nur beim null-Layout, dabei muss nicht die Komponente selber das null-Layout haben,
sondern natürlich der Container, in dem man die Komponente einfügt

und wenn du noch Probleme hast, die Komponente überhaupt zu sehen,
dann würde ich

comp2D.drawLine(5,5,20,20); schreiben und nicht 3 Zeilen verrücken Code, der 10 Fehler versteckt enthalten könnte ;)

auch MouseListener usw. ist doch nciht nötig,
mit kleinen kurzen Programm anfangen
 
R

RedNifre

Gast
Danke für den Tipp! Die beiden anderen Methoden (repaint und paintCompontent) habe ich erstmal gelöscht.
Momentan sieht die paint-Methode im Node nur so aus:
Code:
public class Node extends JPanel{
	[...]
	public void paint() {
		System.err.println("== sapperlot");
	}

Wird aber leider nicht auf der Kommandozeile ausgegeben. :-/
 
S

SlaterB

Gast
hast du mein Posting gelesen? es fehlt in deinem Code übrigens noch ne main-Operation, ein JFrame usw

und verwende
public void paintComponent(Graphics g) {
super.paintComponent(g)

// dein Code
}
 
R

RedNifre

Gast
hast du mein Posting gelesen?
Nein, hatte deinen Kommentar nicht gesehen, da du ihn geschrieben hast während ich gerade meinen schrieb. :wink:

und wenn du noch Probleme hast, die Komponente überhaupt zu sehen,
dann würde ich

comp2D.drawLine(5,5,20,20); schreiben und nicht 3 Zeilen verrücken Code, der 10 Fehler versteckt enthalten könnte

Das große Panel sehe ich ja. Das Problem ist halt, dass im kleinen Panel die paint-Methode garnicht aufgerufen wird.

auch MouseListener usw. ist doch nciht nötig,
mit kleinen kurzen Programm anfangen

Dochdoch, das ist schon nötig, schließlich sollen die kleinen Panels ja da erstellt werden wo man hinklickt.

es fehlt in deinem Code übrigens noch ne main-Operation, ein JFrame usw

Nein, fehlt nicht, das steht einfach nur ganz woanders. Das GPanel wird schon korrekt in der GUI angezeigt. Mir geht es nur um die kleineren Nodes (extends JPanel), die ich per Mausklick frei auf dem GPanel platziert können möchte.

und verwende
public void paintComponent(Graphics g) {
super.paintComponent(g)

// dein Code
}
Habe ich gerade gemacht. Was bewirkt das?
 
S

SlaterB

Gast
das ist einfach nur der Standard beim Überschreiben

http://java.sun.com/docs/books/tutorial/uiswing/painting/step2.html

ich wies darauf hin, weil ich den paint-Tipp von Rajmund eben nicht für den Standard hielt ;)
ist evtl. Geschmackssache


> Nein, fehlt nicht, das steht einfach nur ganz woanders.

wie gesagt: wenn du hier ein Problem ausführlich besprechen willst,
wäre es von Vorteil, allen Code zu posten und dabei natürlich möglichst wenig,
kleine neue komplette Testklassen unabhängig von deinem restlichen Programm, welches zu 90% erstmal gar nicht interessiert

> Dochdoch, das ist schon nötig, schließlich sollen die kleinen Panels ja da erstellt werden wo man hinklickt.

aber nicht im ersten Schritt wenn du das JPanel noch nicht mal sehen kannst.. ;)
 

Marco13

Top Contributor
Ham jetzt grad keine Lust, länger zu antworten, aber als kurzen Einwurf: Eine Knoten-Klasse (die erstmla nicht viel merh macht, als einen Kreis und vielleicht ein bisserl Text zu zeichnen) von einem JPanel abzuleiten ist Humbug.
 
R

RedNifre

Gast
Danke für die Hilfen, ich habs jetzt geschafft; die kleinen Panels sind sichtbar.

Ich hab auch herausgefunden, was das super.paintComponent(comp); tut: Weil die Superklasse das JPanel ist, füllt dieser Aufruf das Panel komplett grau aus. Da ich aber keine Kreise auf grauen Quadraten zeichnen möchte lasse ich diesen Aufruf besser weg.

Jetzt habe ich aber schon das nächste Problem: Ich möchte die Knoten im Bild (Die kleinen Panels) anklickbar machen. Dafür habe ich auch hier einen MouseListener angehängt. Leider landen die Mausklicks aber immer beim Container, also dem GPanel (Hintergrundfläche, auf der die Nodes liegen).
Was muss ich tun, damit ich die Panels im Container anklicken kann, anstatt den Container selbst?[/i]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Kleine Sub-Tabelle in SpreadsheetView-Zelle anzeigen AWT, Swing, JavaFX & SWT 9
C 3 kleine Probleme... AWT, Swing, JavaFX & SWT 13
I Swing Beim Fenster das kleine Symbol(ICS) ändern AWT, Swing, JavaFX & SWT 3
L JPanel kleine "Animation" AWT, Swing, JavaFX & SWT 7
P Pfeilpolygon per Maus rotierbar machen - Kleine Schwierigkeiten AWT, Swing, JavaFX & SWT 29
Z kleine JButtons und ihre Beschriftung AWT, Swing, JavaFX & SWT 5
H kleine Bildbearbeitung AWT, Swing, JavaFX & SWT 3
hdi SWT SWT Table: 2 kleine Probleme AWT, Swing, JavaFX & SWT 4
M Zoomen in ein JPanel... und eine andere kleine Frage AWT, Swing, JavaFX & SWT 3
S Swing Kleine Bilder in Panel einfügen AWT, Swing, JavaFX & SWT 13
E AWT Kleine Hilfestellung bei Bildern in Mediatracker AWT, Swing, JavaFX & SWT 7
G Sehr kleine JButtons mit Icon oder Beschriftung AWT, Swing, JavaFX & SWT 2
M 2 Kleine Fragen zum JOptionFrame AWT, Swing, JavaFX & SWT 5
K kleine frage zum Spinner (bezüglich Action) AWT, Swing, JavaFX & SWT 2
G kleine Frage beim initialisieren AWT, Swing, JavaFX & SWT 2
F kleine Zahlen/buchstaben mit Java darstellen? AWT, Swing, JavaFX & SWT 3
J Kleine frage zu PixelGrabber AWT, Swing, JavaFX & SWT 3
S kleine Frage zu drawPolygon AWT, Swing, JavaFX & SWT 5
N 3 kleine Probleme AWT, Swing, JavaFX & SWT 7
G kleine JDesktopPane problem AWT, Swing, JavaFX & SWT 2
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
I GUI, das verschiedene Panels hat (Von Seite zu Seite navigieren) AWT, Swing, JavaFX & SWT 7
G LayoutManager Panels anordnen über Schleifenvariablen AWT, Swing, JavaFX & SWT 7
B Bounds aller Panels aktualisieren AWT, Swing, JavaFX & SWT 0
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L Swing Panels bewegen wie Windows 10 Kacheln AWT, Swing, JavaFX & SWT 0
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
T Swing Bug: mehrfache Panels bei Mouseover? AWT, Swing, JavaFX & SWT 11
P Zwischen verschiedenen Panels wechseln AWT, Swing, JavaFX & SWT 3
F abgeleitete Panels von einem ContentPanel AWT, Swing, JavaFX & SWT 4
K Event Handling Über JMenuBar die diversen Panels anzeigen AWT, Swing, JavaFX & SWT 10
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
R Swing panels nebeneinander mit BoxLayout.X_AXIS AWT, Swing, JavaFX & SWT 4
P Swing Panels Wechseln AWT, Swing, JavaFX & SWT 9
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
P Drag & Drop zwischen Panels AWT, Swing, JavaFX & SWT 0
V AWT Panels überlappen AWT, Swing, JavaFX & SWT 1
K Panels mit eigenen Controllern in Main-View einbauen AWT, Swing, JavaFX & SWT 4
U Swing Panels im Contentpane durchschalten AWT, Swing, JavaFX & SWT 1
M Handling 1 Fenster mehrere Panels AWT, Swing, JavaFX & SWT 2
S Swing Plätze von 2 panels vertauschen AWT, Swing, JavaFX & SWT 4
T Panels mit Button verbinden AWT, Swing, JavaFX & SWT 3
F Swing Wie verwalte ich meine Panels richtig? AWT, Swing, JavaFX & SWT 2
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
D Stapelung von Panels AWT, Swing, JavaFX & SWT 6
V Swing MouseEvents bei gestapelten Panels AWT, Swing, JavaFX & SWT 2
B JApplet zwei Panels autobreite? AWT, Swing, JavaFX & SWT 2
kodela Teil eines Panels als Graphik speichern AWT, Swing, JavaFX & SWT 3
Kenan89 LayoutManager MigLayout Positionierung von Panels AWT, Swing, JavaFX & SWT 4
A Panels in JavaFX zur Laufzeit erzeugen AWT, Swing, JavaFX & SWT 5
D JButton-Click in JList mit Panels (auf dem der Button ist) AWT, Swing, JavaFX & SWT 6
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
F Panels über buttons zu anderen Panels hinzufügen AWT, Swing, JavaFX & SWT 2
X Swing Resizing der Komponenten innheralb eines Panels AWT, Swing, JavaFX & SWT 2
J Problem mit der Höhe eines Panels AWT, Swing, JavaFX & SWT 11
M Swing JTabbedPane Panels deaktivieren AWT, Swing, JavaFX & SWT 2
S Swing (Nicht) Vergrößern von Panels AWT, Swing, JavaFX & SWT 3
S Drag and Drop über 2 Panels AWT, Swing, JavaFX & SWT 2
B LayoutManager Zeilenweise Anordnung von Panels AWT, Swing, JavaFX & SWT 19
B Panels wechseln auf Knopfdruck AWT, Swing, JavaFX & SWT 17
N Hilfe bei Panels! AWT, Swing, JavaFX & SWT 11
J LayoutManager Panels übereinander AWT, Swing, JavaFX & SWT 3
P Von einem Panel auf die Objekte des anderen Panels zugreifen AWT, Swing, JavaFX & SWT 3
C Aufklappbare Panels AWT, Swing, JavaFX & SWT 2
D Panels Dynamisch zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 2
D Vererbung von Panels AWT, Swing, JavaFX & SWT 8
E Wie Breite und Höhe eines Panels festlegen? AWT, Swing, JavaFX & SWT 5
B Panels stapeln, geht das? AWT, Swing, JavaFX & SWT 7
I 2 Panels übereinander, 1 transparent AWT, Swing, JavaFX & SWT 2
S GridBagLayout Panels AWT, Swing, JavaFX & SWT 2
W Panels vertikal anordnen AWT, Swing, JavaFX & SWT 10
R Swing Kommunikation zwischen Panels AWT, Swing, JavaFX & SWT 2
F Abschaltbare Panels AWT, Swing, JavaFX & SWT 5
aze Layout auf Teil eines Panels anwenden AWT, Swing, JavaFX & SWT 5
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
I Swing Positionieren von Panels mit layoutManager AWT, Swing, JavaFX & SWT 6
B Java Grafiken an bestimmter Positon des Panels anzeigen AWT, Swing, JavaFX & SWT 6
S import von Klassen (zwei Panels eine Form) AWT, Swing, JavaFX & SWT 39
K Zwei Panels zentriert anordnen AWT, Swing, JavaFX & SWT 3
H2SO3- AWT seltsammes verhalten eines Panels AWT, Swing, JavaFX & SWT 9
S Buttons, Panels etc. zu einer Teilkomponente hinzufügen AWT, Swing, JavaFX & SWT 5
S mehere panels übereinander AWT, Swing, JavaFX & SWT 2
Z Swing Gif's in panels einfügen AWT, Swing, JavaFX & SWT 11
N Überschneidung von Panels umgehen AWT, Swing, JavaFX & SWT 3
D java.lang.IllegalArgumentException beim Darstellen eines Panels AWT, Swing, JavaFX & SWT 7
T Border eines Panels nicht an der rechten Kante anzeigen AWT, Swing, JavaFX & SWT 7
F name des panels in der ein button liegt rausfinden AWT, Swing, JavaFX & SWT 10
R AWT: Aufteilung mit Panels? AWT, Swing, JavaFX & SWT 2
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2
G Ein Frame mit mehreren austauschbaren Panels AWT, Swing, JavaFX & SWT 3
I Applet mit Panels (so richtig, gehts besser?) AWT, Swing, JavaFX & SWT 3
G designfrage zu 2 panels AWT, Swing, JavaFX & SWT 2
hdi zeitgleiches fokusieren von zwei panels AWT, Swing, JavaFX & SWT 2
G 2 Panels, 2 Listener, 1 Problem AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben