Einfügen eines eigenen Component

Status
Nicht offen für weitere Antworten.

Mammon

Mitglied
Zum Zeichnen eines Balkendiagramms hab ich mir eine neue Klasse erstellt dieich von Component abgeleitet habe.
Leider habe ich Probleme beim Einfügen in ein JPanel

Code:
JPanel balkPanel=new JPanel();
Point p=new Point();
p=balkPanel.getLocation();
balk_einst= new Balkendiagramm(p.x,p.y,300,300,"Einsteiger",ber);
balkPanel.add(balk_einst);
add(balkPanel,BorderLayout.CENTER);

Das Zeichnen des Balkendiagrammes funktioniert aber nicht wenn ich ein Layout verwende.
Kann das ein Problem mit den Koordinaten und der Länge und Breite sein die ich übergebe?
Das gleiche Problem habe ich auch wenn ich bei einen Textfield setBounds verwende.
 

Oli

Top Contributor
Hallo,

du willst die Location von balkPanel haben, addest es aber erst in Zeile 7.
Des wird nix...

Dann solltest du noch wissen, dass die Location erst vorhanden ist, wenn der Frame gezeichnet wurde.
Vorher wirst du mit getLocation immer einen Point(0,0) bekommen.

Wenn du es einfacher haben willst, kannst du dir mal jFreeChart ansehen ;-)
 

Mammon

Mitglied
Hat jemand einen Link zu einen Turtorial für JFreeChart??

Und eigentlich will ich noch das mein Diagramm auch funzt. Ich füge mein Balkendiagramm eh zu JPanel hinzu ,da müsste ich eh bei der Postion 0,0 im Panel zeichnen können??
 

Mammon

Mitglied
Danke für den Link

Ich hab aber noch immer ein Problem mit meinem Balkendiagramm.
Ich kann es nur im Frame zeichnen und da auch nur 1 Balkendiagramm. Das letzte verschwindet einfach immer.
Im JPanel kann ich gar keins zeichnen.
 
S

SlaterB

Gast
kann gut sein, dass das was mit Layouts und getPreferredSize zu tun hat,

eine Komponente direkt ins JFrame eingefügt wird normalerweise maximiert,
enthät den gesamten Platz,

in ein JPanel eingefügt, welches ein anderes Layout hat, wird die Komponente normalerweise minimiert, so klein wie möglich dargestellt,

ohne Kenntnisse von Swing kann man sowas nur schwer programmieren
 

Mammon

Mitglied
1 Balkendiagramm kann ich ja immer zeichnen mit der gewünschten größe und Position im Frame
Vielleicht hat das was mit paint in meiner Klasse Balkendiagramm zu tun.
Jedes mal wenn ich eines neues Balkendiagramm erstelle wird paint neu aufgerufen
Da könnte es sein das das alte Diagramm übermalen wird.
Hätte da jemand einen Lösungsvorschlag wie ich das umgehen kann?
 
S

SlaterB

Gast
was nicht als Fehler bekannt ist, kann und darf nicht umgangen werden,

du musst deinen Quellcode posten,
erst dann kann man anfangen, konkret über Fehler nachzudenken
 

Mammon

Mitglied
Hier der Code vom Balkendiagramm

Code:
package np.balk;

import java.awt.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;

import np.read.Auslesen;
import np.calc.Berechnung;

public class Balkendiagramm extends JComponent
{
	
	int widthb;
	int heightb;
	int xb;
	int yb;
	String name1;
	Berechnung b;
	
	public Balkendiagramm(int x,int y,int width,int height,String name,Berechnung ber)
	{
		name1=name;
		widthb=width;
		heightb=height;
		xb=x;
		yb=y;	
		b=ber;
	}

	public void paintComponent(Graphics g)
	{	
		int temp=0;
		int []array=new int[9];
		
		int heightdia=(heightb-(heightb/10));			//Höhe des Diagramms
		int widthdia=(widthb-(widthb/10));				//Breite des Diagramms
		int	x0p=(xb+(widthb/10));						// x des Nullpunktes
		int y0p=(yb+(heightb-(heightb/10)));			// y des Nullpunktes
		int spacex=((widthb-(widthb/10))/10);			// Abstand der Zahlen auf der x Achse
		int spacey=((heightb-(heightb/10))/11);			// Abstand der Prozente auf der y Achse
		int balkwidth=((widthb-(widthb/10))/15);		// Breite des Balkens
		int	spacenumbx=((heightb/20));					// Abstand der Zahlen zur x Achse
		int spacenumby=((widthb/15)); 					// Abstand der Zahlen zur y Achse
			
		Font font = new Font("Serif",Font.PLAIN,10);
		g.setFont(font);
		g.setColor(Color.black);
		//y Achse zeichnen
		g.drawLine(x0p,y0p,x0p,y0p-heightdia);
		//x Achse zeichnen
		g.drawLine(x0p,y0p,x0p+widthdia,y0p);
		
		// Zahlen zeichnen unter der x Achse
		for(int i=1;i<=9;i++)
		{
			g.drawString(Integer.toString(i),x0p+(spacex*i),y0p+spacenumbx);
		}
		// Prozente zeichnen neben der y Achse
		for(int i=10;i<=100;i=i+10)
		{
			g.drawString(Integer.toString(i)+"%",x0p-spacenumby,y0p-(spacey*(i/10)));
			
		}
		
		// Balken zeichnen
		
		for(int i=0;i<=8;i++)
		{
			temp = b.getBalkHeight(b.geier_b,name1,i+1);									// Balkenhöhe berechnen
			temp =temp*(heightdia/100);														// Umrechnen der Höhe von % in Pixel
			g.drawRect((x0p+(spacex*(i+1)))-balkwidth/2,y0p-temp,balkwidth,temp);
		}
			
	}
}
 
S

SlaterB

Gast
gerne gerne,
und paintComponent() kannst du nun testweise auf drei Zeilen zusammenkürzen, die einfach nur einen dicken Kasten malen
das für sich ist nur eine Komponente und für dein Problem wohl weniger relevant,

interessant ist nun, auf welche Weise du mehrere Dialgramme layoutest/ in die GUI einfügst,
also zum einen dein Code dafür (in Gesamtansicht bis hoch zum JFrame)
und nicht weniger wichtig, eine Skizze, wie es aussehen SOLL,

mit diesen Informationen kann man dann Fehler und korrektes Vorgehen genau beschreiben
(wenn man denn will, ich beschränke mich wenn möglich auf einfache Tipps)
 

Mammon

Mitglied
Hier der Code
Willst du ne Skizze vom Programmaufbau oder vom Balkenprogramm
weis auch nicht wiso du ne Skizze brauchst


Code:
import java.awt.*;
import java.io.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;

import np.read.Auslesen;
import np.calc.Berechnung;
import np.balk.Balkendiagramm;

public class GUI extends JFrame implements ActionListener
{
	JTextField txt_geb_tag=new JTextField(2);
	JTextField txt_geb_mon=new JTextField(2);
	JTextField txt_geb_jahr=new JTextField(3);
	
	JLabel lbl_geb_dat=new JLabel("Geburtsdatum eingeben:"); 
	JLabel lbl_geier=new JLabel("0");
	JLabel lbl_einst=new JLabel("0");
	JLabel lbl_rück=new JLabel("0");
	JLabel lbl_ausst=new JLabel("0");
	JLabel lbl_misch1=new JLabel("0");
	JLabel lbl_misch2=new JLabel("0");
	JLabel lbl_carrot=new JLabel("0");
	
	JButton but_start=new JButton("Start");
	
	Balkendiagramm balk_einst;
	Balkendiagramm balk_ausst;
	
	Auslesen data=new Auslesen();
	Berechnung ber;
	
	public static void main(String [] args)
	{
		
		
		GUI gui=new GUI();
		
	}
	public GUI()
	{
		super("NumTest");
		
		// Daten Auslesen und Berechnungen ausführen	
		data.ReadIn();
		data.crossSum();
		ber=new Berechnung(data);
		
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 	
		 
		setSize((d.width/4)*3,(d.height/4)*3);						
		
		setLocationByPlatform(true);
		
		//Eingabe Panel
		JPanel eingabePanel=new JPanel();
		eingabePanel.add(lbl_geb_dat);
		eingabePanel.add(txt_geb_tag);
		eingabePanel.add(txt_geb_mon);
		eingabePanel.add(txt_geb_jahr);
		eingabePanel.add(but_start);
		eingabePanel.setBorder(BorderFactory.createEtchedBorder());
		eingabePanel.setLayout(new FlowLayout(FlowLayout.LEFT));
		add(eingabePanel, BorderLayout.NORTH);
		
		//Ausgabe der Zahlen Panel
		JPanel numbPanel=new JPanel();
		numbPanel.add(lbl_einst);
		numbPanel.add(lbl_rück);
		numbPanel.add(lbl_ausst);
		numbPanel.add(lbl_geier);
		numbPanel.add(lbl_misch1);
		numbPanel.add(lbl_misch2);
		numbPanel.add(lbl_carrot);
		numbPanel.setBorder(BorderFactory.createEtchedBorder());
		add(numbPanel,BorderLayout.WEST);
		
		// Version 1:Ausgabe im Panel
	        JPanel balkPanel=new JPanel();
		balk_einst= new Balkendiagramm(0,0,300,300,"Einsteiger",ber);
		balk_ausst= new Balkendiagramm(330,0,300,300,"Rückrat",ber);
		balkPanel.add(balk_einst);
                add(balk_ausst); 
		balkPanel.setBorder(BorderFactory.createEtchedBorder());
		add(balkPanel,BorderLayout.CENTER);
		

                 // Version 2: Ausgabe im Frame
		add(balk_einst); 
		add(balk_ausst); 
		
		setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		but_start.addActionListener(this);
		setVisible(true);
	
	}
	
	public void actionPerformed(ActionEvent e)
	{
		String cmd= e.getActionCommand();
		
		if(cmd=="Start")
		{
			// Zahlen aus dem Textfields auslesen und Berechnungen ausführen
			  ber.calcGebdat(Integer.parseInt(txt_geb_tag.getText()),Integer.parseInt(txt_geb_mon.getText()),Integer.parseInt(txt_geb_jahr.getText()));
			lbl_einst.setText(""+ber.einst_b);
			lbl_rück.setText(""+ber.rück_b);
			lbl_ausst.setText(""+ber.ausst_b);
			lbl_geier.setText(""+ber.geier_b);
			lbl_misch1.setText(""+ber.misch1_b);
			lbl_misch2.setText(""+ber.misch2_b);
			lbl_carrot.setText(""+ber.carrot_b);
		}
			
	} 
	
	
}
 

Mammon

Mitglied
Ja beide Ruf eh nicht im Programm auf
hab eh dazu geschreiben Version1 und Version 2
Layout des Programms weis ich ja selbst noch nicht genau
is derzeit ja nur ein test programm

aber ich glaub der Fehler liegt im Balkendiagram
Kann es sein das ich wenn ich mir ein neues Balkendiagramm erstelle und die paint-Methode aufrufe ich mir die Grpahics speichern muss und beim nächsten Aufruf wieder zeichnen muss???
 
S

SlaterB

Gast
ich meine ja extra 'jeweils'

4x add geht schon gar nicht,
aber 2x add sind auch ein add zuviel, in ein BorderLayout-Center passt nur eine JComponent
 

Mammon

Mitglied
Es funktioniert immer noch nicht
Hab ein Balkdiagramm center und eins east ausgerichtet es wird aber nur das mit center gezeichnet
 
S

SlaterB

Gast
setze bei dem linken
setPreferredSize(x,y);
sonst wird es auf 0x0 zusammengequetscht bzw. vielleicht so hoch wie das JFrame, aber Breite relativ wenig breit
 

Oli

Top Contributor
Hallo,

was ist so schwer daran, es so zu machen wie SlaterB vorgeschalgen hat?
Ein FlowLayout verwenden, dann wird es auch sichtbar werden.
 
S

SlaterB

Gast
nicht unbedingt, das reagiert recht zerquetschend auf Unterelemente ohne prefererred size
 

Oli

Top Contributor
Schon klar, aber man sieht zumindest, ob es funktioniert. In diesem konkreten Fall würde ich ein GridBagLayout verwenden. Ich denke, das wird die Sache am besten darstellen.
Wenn man auf Nummer sicher gehen will nimmt man ein NullLayout, und errechnet die Größe der Balken in Abhängigkeit zur Bildschirmauflösung und der Größe der anderen Komponenten. Das ist aber nicht unbeding trivial. (Deswegen ja auch mein Vorschlag JFreeChart zu verwenden - wenns keine kommerzielle Applikaiton werden soll...)

Grüße Oli
 
S

SlaterB

Gast
SlaterB hat gesagt.:
setze bei dem linken
setPreferredSize(x,y);
sonst wird es auf 0x0 zusammengequetscht bzw. vielleicht so hoch wie das JFrame, aber Breite relativ wenig breit
zählt nicht?
 
M

Michael...

Gast
Mammon hat gesagt.:
Code:
public void paintComponent(Graphics g) {	
		
		int heightdia=(heightb-(heightb/10));			//Höhe des Diagramms
		int widthdia=(widthb-(widthb/10));				//Breite des Diagramms
		int	x0p=(xb+(widthb/10));						// x des Nullpunktes
		int y0p=(yb+(heightb-(heightb/10)));			// y des Nullpunktes
		int spacex=((widthb-(widthb/10))/10);			// Abstand der Zahlen auf der x Achse
		int spacey=((heightb-(heightb/10))/11);			// Abstand der Prozente auf der y Achse
		int balkwidth=((widthb-(widthb/10))/15);		// Breite des Balkens
		int	spacenumbx=((heightb/20));					// Abstand der Zahlen zur x Achse
		int spacenumby=((widthb/15)); 					// Abstand der Zahlen zur y Achse
			
		Font font = new Font("Serif",Font.PLAIN,10);
                                ...
}

Ich würde mal sagen die Zeilen 3 bis 13 haben in der paintComponent(...) überhaupt nichts verloren.
Die Berechnung der Diagrammgröße und der Rest sollte nur gemacht werden wenn die Komponente initalisiert bzw. deren Größe geändert wird und nicht bei jedem Neuzeichnen!!!
Ausserdem werden zumindest in dem Bsp.Code die Variablen xb, yb, widthb, heightb nur bei der Initialisierung des Objektes gesetzt. D.h. eine Größenänderung der Komponente bekommt das "Diagramm" garnicht mit bzw. wenn diese Werte mit 0 initialisiert werden, wie es in dem Fall wohl ist, bleiben sie das gesamte Objektleben lang 0.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
J Buchstabe (char) an zufällige Position eines Strings einfügen Java Basics - Anfänger-Themen 1
K Fehler beim Einfügen eines Programm Icons Java Basics - Anfänger-Themen 6
L Element in Mitten eines Arrays einfügen Java Basics - Anfänger-Themen 3
F Leerzeichen zwischen jeden Buchstaben eines Strings einfügen Java Basics - Anfänger-Themen 16
D einfügen eines koordinatenkreuzes Java Basics - Anfänger-Themen 2
G Bilder in den Hintergrund eines Applets einfügen Java Basics - Anfänger-Themen 16
T Zeichen eines Strings an festgelegter Position einfügen Java Basics - Anfänger-Themen 8
Hilde22 Neu Start JButton einfügen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
melaniemueller setCharAt Leerzeichen zusätzlich einfügen Java Basics - Anfänger-Themen 8
S Algorithmus Datensätze einfügen wenn... Java Basics - Anfänger-Themen 26
E In Array Werte einfügen? Java Basics - Anfänger-Themen 5
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
Gaudimagspam Attribute einfügen private Java Basics - Anfänger-Themen 3
R Inventar und Items auf ein 2D ArrayFeld einfügen Java Basics - Anfänger-Themen 2
S Bild einfügen // NEU Java Basics - Anfänger-Themen 12
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
V_Fynn03 Erste Schritte Einen Wert in ein TextField einfügen aus einer anderen Klasse Java Basics - Anfänger-Themen 3
E Datentypen Einfügen von Objekten in eine Map Java Basics - Anfänger-Themen 2
O Naives links rechts einfügen in ADT Baum Java Basics - Anfänger-Themen 8
O BinärBaum einfügen Java Basics - Anfänger-Themen 13
M Sqlite table löschen und daten einfügen Java Basics - Anfänger-Themen 5
M Erste Schritte Mit Variable verschiedene Texte in Textfeld einfügen Java Basics - Anfänger-Themen 27
M Klasse in JTable einfügen Java Basics - Anfänger-Themen 7
J In einer Klasse ein AlertDialog einfügen Java Basics - Anfänger-Themen 4
S Elemente in Liste einfügen Java Basics - Anfänger-Themen 2
S Interface (WindowBuilder) Panels in einen Frame einfügen Java Basics - Anfänger-Themen 10
x-tshainge Java Bilder einfügen Java Basics - Anfänger-Themen 1
T Variablen “ in String einfügen Java Basics - Anfänger-Themen 1
Orkanson Objekte in ein Array einfügen Java Basics - Anfänger-Themen 5
S Doppelte Liste Einfügen Java Basics - Anfänger-Themen 1
X Objekte in ArrayList einfügen Java Basics - Anfänger-Themen 10
jaleda100 JTextArea Zeile einfügen Java Basics - Anfänger-Themen 1
R Spielfeldbegrenzung einfügen (Java)? Brauche Hilfe! Java Basics - Anfänger-Themen 15
D B-Baum einfügen und löschen Java Basics - Anfänger-Themen 2
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
JavaNewbie2.0 Tausende Wörter in Arrays automatisch einfügen Java Basics - Anfänger-Themen 10
J Wie kann ich Images per Tastendruck anzeigen/einfügen? Java Basics - Anfänger-Themen 3
F In LinkedList einen Wert ersetzen oder neu einfügen Java Basics - Anfänger-Themen 7
C Verkettete Liste - sortiert einfügen Java Basics - Anfänger-Themen 7
J Scroll-Leiste einfügen Java Basics - Anfänger-Themen 12
U Sound einfügen Java Basics - Anfänger-Themen 6
P String zerstückeln und in Excel einfügen Java Basics - Anfänger-Themen 11
J Objecte in TreeSet einfügen klappt nicht Java Basics - Anfänger-Themen 5
P Variablen Wie kann ich eine lokale Variable in eine andere Methode einfügen? Java Basics - Anfänger-Themen 27
S Bild einfügen Java Basics - Anfänger-Themen 16
D Taschenrechnerereignisse einfügen Java Basics - Anfänger-Themen 18
B Vererbung In offener Hash Tabelle einfügen Java Basics - Anfänger-Themen 4
W Listenelement einfügen Java Basics - Anfänger-Themen 9
P OOP Eingabevariablen der Klasse Raum in der Methode addEvent ans Ende einer ArrayList einfügen Java Basics - Anfänger-Themen 3
8 Eigenes Bild in email einfügen Java Basics - Anfänger-Themen 1
D Datenbankzugriff - Leere Zeile einfügen Java Basics - Anfänger-Themen 2
GadgetSofa IOException fehlt aber wo einfügen? Java Basics - Anfänger-Themen 6
K JTable Bild einfügen Java Basics - Anfänger-Themen 1
A Objekte in eine Liste einfügen Java Basics - Anfänger-Themen 7
J Methoden Einfügen von Objekten nach Alphabet in ArrayList funktioniert nicht Java Basics - Anfänger-Themen 2
S jList --> Array einfügen und Liste löschen Java Basics - Anfänger-Themen 5
C Kalender in Applet einfügen Java Basics - Anfänger-Themen 0
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
D Bild in Frame einfügen Java Basics - Anfänger-Themen 11
F Collections Sortierung und Einfügen von Elementen Java Basics - Anfänger-Themen 1
K Erste Schritte Classe in andere Einfügen?? Java Basics - Anfänger-Themen 12
P Klasse in Klasse einfügen (arrayliste) Java Basics - Anfänger-Themen 7
F Bibliotheken einfügen ??? Java Basics - Anfänger-Themen 2
P Hintergrundbild in Swing einfügen Java Basics - Anfänger-Themen 3
T HashMap Werte einfügen, durchsuchen und auslesen Java Basics - Anfänger-Themen 17
K JTextField in ein Spiel einfügen Java Basics - Anfänger-Themen 2
Q Erste Schritte In CharArrayWriter Zeichen an Stelle einfügen Java Basics - Anfänger-Themen 4
J Daten in eine JList einfügen Java Basics - Anfänger-Themen 6
J Neue Zeile an bestimmter Stelle in Textdatei einfügen Java Basics - Anfänger-Themen 2
D Durch Button klick wert in JTextField einfügen Java Basics - Anfänger-Themen 5
J Button in extra Klasse festlegen und in anderer Klasse einfügen? Java Basics - Anfänger-Themen 3
J GUI Button Klasse in anderer Klasse einfügen Java Basics - Anfänger-Themen 3
E HILFE Projekt für die Schule--> Bilder einfügen Java Basics - Anfänger-Themen 9
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
D String aus txt in label für Tabelle einfügen Java Basics - Anfänger-Themen 8
A Aktuelles Datum einfügen.. Java Basics - Anfänger-Themen 4
I fertige xml-datein in eine noch aufzubauende xml-datei einfügen Java Basics - Anfänger-Themen 4
N JTable - Zellfarben ändern, GUI-Komponenten in Zellen einfügen Java Basics - Anfänger-Themen 5
B Ordner in jar dateien einfügen Java Basics - Anfänger-Themen 4
S Erste Schritte Bluej Automatisches Einfügen von Objekten Java Basics - Anfänger-Themen 4
A String aus anderer Klasse in JTextArea einfügen Java Basics - Anfänger-Themen 7
J Bild einfügen Java Basics - Anfänger-Themen 3
S Musik einfügen funktioniert noch nicht Java Basics - Anfänger-Themen 6
K paint() mit einfügen Java Basics - Anfänger-Themen 14
A Sortiertes Einfügen in Liste Java Basics - Anfänger-Themen 2
B org.apache.commons.... Folder in Projekt einfügen Java Basics - Anfänger-Themen 6
Kenan89 String in ObjectList einfügen Java Basics - Anfänger-Themen 2
H Bilder im GUI einfügen Java Basics - Anfänger-Themen 12
A SwingX in Eclipse einfügen Java Basics - Anfänger-Themen 5
B Einfügen von Dateien Java Basics - Anfänger-Themen 10
M Java String " einfügen Problem Java Basics - Anfänger-Themen 2
M Video in ClassLoader einfügen Java Basics - Anfänger-Themen 7
S Itext und eine neue Zeile einfügen Java Basics - Anfänger-Themen 2
P JPanel in JTable einfügen Java Basics - Anfänger-Themen 23
D Werte aus Excel in Diagramm einfügen Java Basics - Anfänger-Themen 6
Binary.Coder Vor und nach jeder Codezeile etwas einfügen Java Basics - Anfänger-Themen 3
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben