JPanel - zeichnen in skalierten Bereich - Linie (X-Achse) nicht sichtbar

Status
Nicht offen für weitere Antworten.

redbomber

Bekanntes Mitglied
Hi zusammen. Ich brauche eure Hilfe :/ Ich komm hier nicht weiter.
Ich möchte Werte in ein JPanel einzeichnen. Dabei sind die Werte Als Boxen repräsentiert, deren Höhe dem Wert entsppricht. Um dies zu erreichen skaliere ich die Höhe auf meinen Wertebereich (Also die Y-Achse)
Die X-Achse skaliere ich nicht.

Nun möchte ich immer die X-Achse angezeigt bekommen. Das klappt aber nicht, wenn alle Werte >0 bzw <0 sind.
Bei mir zeichnet es dann einfach die X-Achse nicht und ich verstehe nicht wieso.
Wenn ich positive und negative Werte habe dann klappt es allerdings.

Java:
// width und height ist von dem Panel
public void paint(Graphics g, int width, int height, LayoutTracker arg3) {
		
	final Graphics2D g2dmain = (Graphics2D) g.create();
	final Graphics2D g2help = (Graphics2D) g.create();
	g2help.setColor(Color.WHITE);
	g2help.fillRect(0, 0, width, height);
	/* get the component size */
		
	final Insets ins = pps.getInsets();
		
	double maxy = maxValue;
        double miny = minvalue;
        double maxx = width;
        double minx = 0;

        // Falls alle Werte <0 bzw >0 dann Wertebereich auf 0 verschieben
        if(maxy<0) maxy = 0;
        else if(miny >0) miny = 0;
        
        if(miny==0 && maxy==0) 
        {
        	maxy=1;
        	miny=-1;
        }
        

	/* transform view into codomain */
	g2dmain.translate(ins.left, ins.top);
	g2dmain.scale(1, -(height-1) / Math.abs(maxy - miny));
	g2dmain.translate(minx, -maxy);

	/* assign a 1px stroke */
	g2dmain.setStroke(new BasicStroke(1f / width, BasicStroke.CAP_ROUND,
				BasicStroke.JOIN_ROUND));

	final Rectangle rect = pps.getVisibleRect();
	
	// hier zeichne ich meine Boxen in das Panel. Die Höhe ist entpsprechend dem Wert der Daten an der
        //X-Position
	drawPlot(g2dmain, g2help, rect);
        
        
	// Zeichne X-Achse:
        final Line2D.Double zeroLine = new Line2D.Double();
	g2dmain.setColor(Color.black);
	zeroLine.setLine(0., 0., width,0.);
	g2dmain.draw(zeroLine);	
}

Habt ihr mir einen Tip was ich an der skalierung falsch mache?
 
Zuletzt bearbeitet von einem Moderator:

redbomber

Bekanntes Mitglied
Aber wieso, ich mache in meiner paint Methode doch garnicht viel:

hiermit bestimme ich meine Range von der X-Achse und von der Y-Achse (das kann ich auch aus der paint Methode rausziehen). Mit dem unterem Teil lege ich nur fest, wenn alle Werte größer/kleiner null sind, daß trotzdem meine Y-Achse ab 0 beginnt.
Code:
double maxy = maxValue;
double miny = minvalue;
double maxx = width;
double minx = 0;

if(maxy<0) maxy = 0;
        else if(miny >0) miny = 0;
        
if(miny==0 && maxy==0){
   maxy=1;
   miny=-1;
}

Hiermit skaliere ich meinen Bereich, wobei ich nu in der Y-Achse skaliere. Die X-Achse bleibt unskaliert
Code:
/* transform view into codomain */
g2dmain.translate(ins.left, ins.top);
g2dmain.scale(1, -(height-1) / Math.abs(maxy - miny));
g2dmain.translate(minx, -maxy);


Und zu guter letzt möchte ich einfach nur die Nullinie zeichnen:
Code:
final Line2D.Double zeroLine = new Line2D.Double();
g2dmain.setColor(Color.black);
zeroLine.setLine(0., 0., width,0.);
g2dmain.draw(zeroLine);

Aber ich verstehe trotzdem nicht wo mein Fehler liegt
 

Ebenius

Top Contributor
Vorab: Bitte gewöhn Dir mal an, [noparse]
Java:
[/noparse]-Tags statt [noparse][code][/noparse]-Tags zu benutzen. Java-Tags machen Syntax-Highlighting und Zeilennumerierung. Siehe: [thread=80991]BBCode - Textauszeichnung im Forum[/thread].

Bau mal zum Test Deinen Code um! Die Zeilen 28 bis 31 kannst Du ersetzen. Wenn ich mich nicht irre, ist das Resultat das gleiche, aber die [I]myTransform[/I] brauchen wir zum Test: [code=Java]final AffineTransform myTransform =
      AffineTransform.getTranslateInstance(ins.left, ins.top);
myTransform.scale(1, -(height - 1) / Math.abs(maxy - miny));
myTransform.translate(minx, -maxy);

g2dmain.transform(myTransform);
In Zeile 47 fügst Du nun ein:
Java:
final double[] src = { 0., 0., width, 0. };
final double[] dst = new double[4];
myTransform.transform(src, 0, dst, 0, 2);
System.out.printf("Drawing base line: %.3f, x %.3f -> %.3f x %.3f",
      dst[0], dst[1], dst[2], dst[3]);
System.out.println();
System.out.printf("Component size: %d x %d", getWidth(), getHeight());
System.out.println();
Sofern g2dmain der vom AWT gelieferte Graphikkontext ist (also keine Transformation des Graphics-Objektes Deinerseits außerhalb Deiner paint(...)-Methode), solltest Du so die Koordinaten der Null-Linie im normalen Koordinatensystem der Komponente (0x0 ist die linke obere Ecke, wie immer) sehen. Überprüf mal, ob die überhaupt im sichtbaren Bereich Deiner Komponente liegen.

Ebenius
 
Zuletzt bearbeitet:

redbomber

Bekanntes Mitglied
Also ich habe den Code wie folgt geändert:

Java:
final double[] src = { 0., 0., width, 0. };
final double[] dst = new double[4];
myTransform.transform(src, 0, dst, 0, 2);
System.out.printf("Drawing base line: %.3f, x %.3f -> %.3f x %.3f",
		      dst[0], dst[1], dst[2], dst[3]);
System.out.println();
System.out.printf("Component size: %d x %d", width, height);
System.out.println();
		
zeroLine.setLine(0., 2., width,2.); // Setze ich y auf 2. dann ist die Linie sichtbar
g2dmain.draw(zeroLine);

Die Linie ist nicht sichtbar, sie befindet sich also außerhalb des sichtbaren bereichs.
Ab y = 2, ist diese Linie zu sehen. Diese Linie befindet sich allerdings ganz unten, also nicht bei 0x0.
 

Ebenius

Top Contributor
Tipp ins Blaue: Deine Berechnung bzgl. der Insets ist falsch. Aber ich hab nicht genau darüber nachgedacht. :D

Ebenius
 

redbomber

Bekanntes Mitglied
noch eine Frage:

was bewirkt genau das hier:

Java:
final double[] src = { 0., 0., width, 0. };
final double[] dst = new double[4];
myTransform.transform(src, 0, dst, 0, 2);

Also zeichne ich hiermit in meinem Koordinatensystem oder zeichne ich da auf der normalen Ausrichtung, also 0x0 ist links oben
 

Ebenius

Top Contributor
Schonmal in die API-Doc geschaut? Damit zeichnest Du gar nichts, Du transformierst die Punkte aus dem Quell-Array src (x1, y1, x2, y2, ..., xn, yn) in das Ziel-Array dst (x1', y1', x2', y2', ..., xn', yn').

Ebenius
 

redbomber

Bekanntes Mitglied
Ich habe hier noch eine Frage zu meiner drawPlot() Methode:
Ich möchte an jeder Position im Panel eine Box zeichnen, die so hoch ist wie der darzustellende Wert.
Positive Werte bekommen eine Box nach oben
negative Werte eine Box nach unten

Nun habe ich die Frage ob ich diese Boxen von der Höhe her korrekt zeichne.
Mir ist aufgefallen, daß die negativen Boxen nie bis zum dem miny Wert reichen, sondern immer einen Pixel davor aufhören. Wisst ihr woran das liegen kann?

Java:
private void drawPlot(Graphics2D g2dmain, AffineTransform myTransform, Rectangle rect) {
		
	final double[] src = { 0., 0., width, 0. };
	final double[] dst = new double[4];
	myTransform.transform(src, 0, dst, 0, 2);
		
	Rectangle2D.Double r2d = null;
	...
	...
        // val ist der darzustellende Wert, dieser bestimmt die Höhe meiner Box
	if(!val.isNaN()){
								
		if(val > 0.){
			r2d = new Rectangle2D.Double(0, 0, 1.0,val);
			r2d.x = i * 1;
			g2dmain.fill(r2d);
									
		} else if(val<0.){
			r2d = new Rectangle2D.Double(0, val, 1.0,Math.abs(val));
			r2d.x = i * 1;
			g2dmain.fill(r2d);
		}
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
P JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
T Oval auf ein JPanel zeichnen AWT, Swing, JavaFX & SWT 3
S Swing Bild in JPanel in ScrollPane neu zeichnen AWT, Swing, JavaFX & SWT 2
H String auf Knopfdruck in JPanel zeichnen. AWT, Swing, JavaFX & SWT 6
L Freies zeichnen auf JPanel AWT, Swing, JavaFX & SWT 3
das-mo AWT In JPanel 2mal zeichnen AWT, Swing, JavaFX & SWT 3
R JPanel auf JFrame neu zeichnen AWT, Swing, JavaFX & SWT 11
P RAM-Auslastung - Problem. Zeichnen von JPEGs auf JPanel AWT, Swing, JavaFX & SWT 2
A Swing Zeichnen auf JPanel AWT, Swing, JavaFX & SWT 4
B Zeichnen von Bildern auf JPanel aus eigenem Objekt AWT, Swing, JavaFX & SWT 19
B Swing JPanel in Abhängigkeit von DefaultListModel Instanz neu zeichnen AWT, Swing, JavaFX & SWT 3
S auf einem mit Netbeans (GUI) erstellten JPanel (eines JFrames) zeichnen? AWT, Swing, JavaFX & SWT 7
Sammay Swing JPanel nach dem einfügen neu zeichnen AWT, Swing, JavaFX & SWT 6
N JPanel zeichnen AWT, Swing, JavaFX & SWT 4
V Bild auf JPanel zeichnen AWT, Swing, JavaFX & SWT 9
G Swing Kreise auf JPanel zeichnen AWT, Swing, JavaFX & SWT 11
V Zeichnen auf JPanel und in JFrame einfügen AWT, Swing, JavaFX & SWT 16
D In JPanel zeichnen AWT, Swing, JavaFX & SWT 11
E Rechteck in JPanel Zeichnen AWT, Swing, JavaFX & SWT 6
S Koordinaten aus Array verwenden zum zeichnen auf JPanel?! AWT, Swing, JavaFX & SWT 3
0din Jpanel will nich alles zeichnen AWT, Swing, JavaFX & SWT 15
R JPanel - BufferedImage - zeichnen großer Bilder AWT, Swing, JavaFX & SWT 2
J Swing JScrollPane nimmt das JPanel zum Zeichnen nicht an AWT, Swing, JavaFX & SWT 5
B Zeichnen in jPanel AWT, Swing, JavaFX & SWT 2
R JPanel - Markierung an der Mausposition zeichnen AWT, Swing, JavaFX & SWT 4
R JPanel in JScrollPane - zeichnen der Mausposition AWT, Swing, JavaFX & SWT 3
R JPanel in JScrollPane neu zeichnen AWT, Swing, JavaFX & SWT 7
R JPanel - zeichnen eines Arrays AWT, Swing, JavaFX & SWT 18
G JPanel neu zeichnen mit repaint AWT, Swing, JavaFX & SWT 15
W Zeichnen verschiedener geom. Figuren in einem JPanel AWT, Swing, JavaFX & SWT 5
M In eigene JPanel Klasse zeichnen AWT, Swing, JavaFX & SWT 4
F JPanel übereinander zeichnen AWT, Swing, JavaFX & SWT 4
S Zeichnen in einem JPanel AWT, Swing, JavaFX & SWT 15
N Formen drehen und auf JPanel zeichnen AWT, Swing, JavaFX & SWT 6
B JPanel + Zeichnen AWT, Swing, JavaFX & SWT 3
S Problem mit dem Zeichnen einer Linie auf einem JPanel AWT, Swing, JavaFX & SWT 30
M Auf JPanel zeichnen AWT, Swing, JavaFX & SWT 17
H Punkte auf einem JPanel zeichnen AWT, Swing, JavaFX & SWT 4
G Auf JPanel zeichnen? AWT, Swing, JavaFX & SWT 2
P JPanel Inhalt neu zeichnen AWT, Swing, JavaFX & SWT 5
feuervogel in Jpanel zeichnen AWT, Swing, JavaFX & SWT 3
M JPanel ausserhalb von paintComponent zeichnen AWT, Swing, JavaFX & SWT 6
L Komponente und Grafik gleichzeitig auf JPanel zeichnen AWT, Swing, JavaFX & SWT 11
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
Ich lerne Java. Swing Von JPanel A auf JPanel B zugreifen. AWT, Swing, JavaFX & SWT 4
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JPanel rotieren, Bild ist abgeschnitten, Clipping? AWT, Swing, JavaFX & SWT 0
M Swing JPanel flüssig verschieben AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben