In eigene JPanel Klasse zeichnen

Status
Nicht offen für weitere Antworten.

MisterDan

Mitglied
Hi Leute,

mein Programm hat bisher auf Mausklick an die geklickte Stelle einen Kreis mit ID (Waypoint) direkt in den JFrame gezeichnet.
Es soll mal ein "Waypoint-Creator" (zum erstellen von Wegpunkten, wo später eine Spielfigur lang läuft) werden.

So bisher hat auch alles funktioniert.

Nun musste ich mein Programm aus diversen Gründen umbauen und nun will ich in ein JPanel zeichnen.
Dafür hab ich mir eine Klasse "DrawPane" erstellt die von JPanel abgeleitet und außerdem noch einen Mouselistener implementiert.

Ich hab keine Paint-Methode oder sonstige Methoden der Klasse überschrieben.

Problem:

Vorher hab ich im Hauptprogramm (MainPogram) auf Mausklick eine Instanz der Klasse "Waypoint" (abgeleitet von Component) erstellt.
Waypoint zeichnet sich selbst. Dann einfach diese Instanz (welche ja ein Component ist) dem JFrame hinzugefügt.

Sprich:

getContentPane().add(waypoint);
getContentPane().paintAll(getContentPane().getGraphics());

Hat einwandfrei funktioniert!

Jetzt möchte ich genau das gleiche mit dem JPanel machen, also denke ich mir:

drawPanel.add(waypoint);
drawPanel.paintAll(drawPanel.getGraphics());

oder

drawPanel.add(waypoint);
drawPanel.paintAll(drawPanel.getGraphics());
drawPanel.invalidate();

oder

drawPanel.add(waypoint);
drawPanel.paintAll(drawPanel.getGraphics());
drawPanel.repaint();

ABER NICHTS TUT SICH! Wenn ich mir aber nach jedem Mausklick aber
System.out.println(drawPanel.getComponentCount());
aufrufe erhöht sich der Wert immer um 1.
Das heisst er fügt wohl nach jedem Mausklick eine Komponenten (Waypoint) hinzu!
NUR SEHE ICH DIESE NICHT!

Hat irgendjemand eine Idee. Es handelt sich um ein Studien-Projekt und in 2 Wochen ist Abgabe.

Ich danke jetzt schon 1000x im vorraus!

Mfg

MisterDan
 
S

SlaterB

Gast
> drawPanel.paintAll(drawPanel.getGraphics());

das ist ja schaurig, geht drawPanel.repaint(); nicht?

----------

ist das drawPanel überhaupt zu sehen? Layout in Swing kann manchmal tücksich sein,
je nach Layout der Oberkompontente werden Unterkomponenten gar nicht, minimiert auf 0,0, füllend oder in sonstigen Mittelgrößen anzeigt,

mit einem vollständigen Code-Beispiel wäre allen sehr geholfen,
evtl. gehts ja auch mit einfachen JLabel-Objekten statt Waypoints?
 

MisterDan

Mitglied
erstmal danke für die schnelle Antwort!

ich weiss, es ist schaurig, aber ich bin auch verzweifelt :?
drawPanel.repaint() geht leider nicht, was mich ja so verwundert!

das drawPanel ist zu sehen. Hatte anfangs auch große Probleme damit, ohh jaa Layout in Swing kann sehr tückisch sein *g*
Ich weiss das es mitterweile zu sehen ist, da ich die Backgroundcolor ändern kann und ergebnisse sehe, außerdem hab ich das JPanel auf Dimension(5000,5000) und man kann scrollen und scrollen, was bei ner größe von 0,0 ja auch nicht ginge. Wäre aber ein guter lösungsansatz gewesen.

Nein geht leider, leider nicht mit JLabeln, sorry! ->Da kommen später noch Verbindungslinien und so hinzu, spätestens dann gehts nicht mehr mit JLabeln.


Hilft das Weiter?

Hier mal ein bisschen Code:
Code:
public class MainProgram extends JFrame implements ItemListener{
....attribute.....
public MainProgram(){
.... fenstereinstellungen, buttons, panels, etc...
sowie,

//DrawPanel
		this.drawPanel = new DrawPane(/*cList, wpList*/);
		Dimension size = new Dimension(5000, 5000);
		this.drawPanel.setPreferredSize(size);
		this.drawPanel.setMinimumSize(size);
		this.drawPanel.setMaximumSize(size);
		this.drawPanel.setSize(size);
		this.drawPanel.setBackground(Color.black);
		
		//ScrollPane
		this.scrollPane = new JScrollPane();
		this.scrollPane.setPreferredSize(new Dimension(400,200));
		this.scrollPane.setBackground(Color.orange);
		this.scrollPane.setMinimumSize(new Dimension(400,200));
		this.scrollPane.setMaximumSize(new Dimension(400,200));
		this.scrollPane.setPreferredSize(new Dimension(400,200));
		this.scrollPane.invalidate();
		this.scrollPane.updateUI();
		this.scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		this.scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		this.scrollPane.setViewportView(drawPanel);	
this.getContentPane().add(BorderLayout.EAST,configPanel);
		this.getContentPane().add(scrollPane);
		
		this.setVisible(true);
		this.doLogic();
	}

public void doLogic()
    {
    	drawPanel.addMouseListener(new MouseAdapter() 
    	{
          public void mouseClicked(MouseEvent arg0) 
          {
        	 // klick auswerten     	 
        	 //System.out.print("Getted XPos: " + drawPanel.getXPos());
        	 //System.out.println(", Getted yPos: " + drawPanel.getYPos());

          	waypointIDCounter++;
 /*
*
*HIER SOLL JETZT DIE ERSTELLTE KOMPONENTE ("WAYPOINT") DEM PANEL HINZUGEFÜGT WERDEN!!
*WAS IST DARAN FALSCH?????
*
*/
          	waypoint = new Waypoint(waypointIDCounter, 100, 100); //hier würden dann die X und Y positionen hin kommen
          	drawPanel.add(waypoint);
          	//drawPanel.paintAll(drawPanel.getGraphics());
          	drawPanel.invalidate();
          	drawPanel.repaint();
          	
          	System.out.println(drawPanel.getComponentCount());
   }
    	});
    }


Wie man sieht wird in DrawPane nichts überschrieben:

Code:
public class DrawPane extends JPanel implements MouseListener {
private int x;
    private int y;

public DrawPane()
	{
		
		this.addMouseListener(this);
	}


public int getXPos(){
		return this.x;
	}
	
	public int getYPos(){
		return this.y;
	}
	
	@Override
	public void mouseClicked(MouseEvent event) {
//		System.out.println("clicked1");
//		System.out.println(event.getX());
//		System.out.println(event.getY());
		this.x = event.getX();
		this.y = event.getY();
	}


Code:
public class Waypoint extends Component {
	
	
	private int ID;
	private int xPos;
	private int yPos;
	private String name;
	
	public Waypoint(int waypointIDCounter, int xPos, int yPos){
		this.ID = waypointIDCounter;
		this.xPos = xPos;
		this.yPos = yPos;
		this.name = "Waypoint"+waypointIDCounter;
	}
	
	public void paint(Graphics g) {
		System.out.println("PAINT!!!!!");
        g.setColor(Color.white);
        g.drawOval(xPos, yPos, 50, 50 );
        g.drawString(""+ID, ((xPos)+22), ((yPos)+30));
    }
 
S

SlaterB

Gast
so, hier eine gekürzte funktionierende, vollständig laufende Version:

Code:
public class MainProgram
    extends JFrame
{
    DrawPane drawPanel;
    JScrollPane scrollPane;
    static int waypointIDCounter;

    public MainProgram()
    {
        // DrawPanel
        drawPanel = new DrawPane(/* cList, wpList */);
        Dimension size = new Dimension(400, 400);
        drawPanel.setPreferredSize(size);
        drawPanel.setBackground(Color.black);

        // ScrollPane
        scrollPane = new JScrollPane(drawPanel);
        getContentPane().add(BorderLayout.CENTER, scrollPane);

        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        doLogic();
    }

    public void doLogic()
    {
        drawPanel.addMouseListener(new MouseAdapter()
            {
                public void mouseClicked(MouseEvent arg0)
                {
                    waypointIDCounter++;
                    Waypoint waypoint = new Waypoint(waypointIDCounter, 100, 100); // hier
                    drawPanel.add(waypoint);
                    drawPanel.validate();
                    System.out.println(drawPanel.getComponentCount());
                }
            });
    }

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

}

---------------

public class DrawPane
    extends JPanel
{
    private int x;
    private int y;

    public DrawPane()
    {

    }

}

--------

public class Waypoint
    extends Component
{
    private int ID;
    private int xPos;
    private int yPos;
    private String name;

    public Waypoint(int waypointIDCounter, int xPos, int yPos)
    {
        this.ID = waypointIDCounter;
        this.xPos = xPos;
        this.yPos = yPos;
        this.name = "Waypoint" + waypointIDCounter;
        this.setPreferredSize(new Dimension(100, 100));
        // this.setBorder(BorderFactory.createLineBorder(Color.red));
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        System.out.println("PAINT!!!!!");
        g.setColor(Color.red);
        g.fillRect(0, 0, 100, 100);
        g.setColor(Color.white);
        g.drawOval(0, 0, 50, 50);
        g.drawString("" + ID, ((0) + 22), ((0) + 30));
    }

}


Hauptproblem 1:
ohne einen validate()-Aufruf wird das Layout nicht neu berechnet,
die neuen Komponenten nicht angezeigt

invalidate(); klingt ähnlich, aber knapp daneben ist auch vorbei ;)

Hauptproblem 2:
die neuen Waypoints haben standardmäßig eine Größe 0,0,
ohne ein setPreferredSize(new Dimension(100, 100)); läuft nicht viel,
(abhängig vom Layout von DrawPane, bei anderem Layout sind evtl. andere Schritte nötig)

Nebenproblem:
selbst wenn Waypoint eine gewisse Größe hätte, würde bei deiner komplizierten paint-Operation nichts zu sehen sein,
du malst erst bei Position 100,100, wenn also Waypoint weniger als 100,100 groß ist, wird gar nix gemalt

immer mit einfachen Zeichenoperationen wie 'alles rot malen' anfangen (von Punkt 0,0 aus),
der Richtpunkt 0,0 in Paint ist der Anfang der Komponente, nicht des DrawPanels,

ob Component so geeignet ist, weiß ich nicht,
nimm wenigestens JComponent, dann kannst du Border setzen,
die sehr gut geignet sind, selbst Komponenten mit Größe 0,0 zu erkennen
 

MisterDan

Mitglied
Wow, ich bin beeindruckt!

Vielen Dank dafür und auch für die sehr verständliche Erklärung!

Ich weiß nicht was ich noch sagen soll außer 1000send Dank^^

Mfg

MisterDan
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
H MouseAdapter Klasse nutzen wenn eigene Klasse bereits von anderer erbt AWT, Swing, JavaFX & SWT 13
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
L JavaFX Eigene Font benutzen AWT, Swing, JavaFX & SWT 6
B Notepad++ in die eigene GUI einbinden AWT, Swing, JavaFX & SWT 7
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
S JavaFX Drehen um eigene Achse AWT, Swing, JavaFX & SWT 2
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L JavaFX Eigene JavaFX Controls anlegen AWT, Swing, JavaFX & SWT 1
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
A JavaFX Scene Builder eigene Klasse hinzufügen AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
T Swing Eigene Konsole AWT, Swing, JavaFX & SWT 5
D Swing Eigene Tabelle AWT, Swing, JavaFX & SWT 18
M eigene horizontale Scrollbar AWT, Swing, JavaFX & SWT 1
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
J JavaFX Eigene ListCell Problem(Objekte werden doppelt angezeigt) AWT, Swing, JavaFX & SWT 1
C Swing MenuBar als eigene Klasse AWT, Swing, JavaFX & SWT 4
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
Kenan89 3D Models aus anderen Spielen in eigene einfügen AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
P Eigene CMD GUI zum Starten von JAR AWT, Swing, JavaFX & SWT 10
M Swing eigene Dialoge, aber wie genau? AWT, Swing, JavaFX & SWT 5
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
K 3D-Grafik Eigene "Kamera" AWT, Swing, JavaFX & SWT 2
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
alderwaran Swing XML editor plugin für eigene anwendung AWT, Swing, JavaFX & SWT 2
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
L Eigene Design Oberfläche erstellen AWT, Swing, JavaFX & SWT 3
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
T SWT eigene Komponenten AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
A Eigene StatusBar AWT, Swing, JavaFX & SWT 2
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
D Eigene Methode soll Gerade zeichnen AWT, Swing, JavaFX & SWT 5
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
MrMilti eigene Klasse in JTable ablegen AWT, Swing, JavaFX & SWT 12
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
A Eigene Border für Buttons AWT, Swing, JavaFX & SWT 19
A Eigene Buttons AWT, Swing, JavaFX & SWT 20
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
S Eigene GUI (evt. Toolkit) AWT, Swing, JavaFX & SWT 10
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
& eigene Schriftart in JEditorpane AWT, Swing, JavaFX & SWT 2
T Eigene Fenster kreieren?zb. wie bei Winamp? AWT, Swing, JavaFX & SWT 9
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
M Eigene Klasse für mehrer JSplitPanes AWT, Swing, JavaFX & SWT 3
M Eigene Komponenten basteln AWT, Swing, JavaFX & SWT 25
O Eigene GUI Objekte entwerfen? AWT, Swing, JavaFX & SWT 3
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
S Eigene Komponenten AWT, Swing, JavaFX & SWT 2
T Eigene erweiterte MouseEvents nutzen AWT, Swing, JavaFX & SWT 2
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
M eigene ComponentUI und Serializable AWT, Swing, JavaFX & SWT 3
E Eigene Steuerelemente bauen AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
G fullscreen GUI - eigene components? AWT, Swing, JavaFX & SWT 2
T 4 db tabellen in einem karteireiter eigene klasse für die me AWT, Swing, JavaFX & SWT 7
S SWT Für jede gui komponente eigene methode AWT, Swing, JavaFX & SWT 2
J Eigene Fehlermeldung in AWT erzeugen AWT, Swing, JavaFX & SWT 2
D eigene SwingKonsole. AWT, Swing, JavaFX & SWT 5
I Eigene JComboBox AWT, Swing, JavaFX & SWT 10
C UIDefaults für eigene Klasse anpassen AWT, Swing, JavaFX & SWT 3
C ISelectionProvider und eigene Selections AWT, Swing, JavaFX & SWT 2
M kann man auch eigene look and feels machen? AWT, Swing, JavaFX & SWT 2
L eigene Komponente, ActionEvent senden? AWT, Swing, JavaFX & SWT 3
E Beim Schließen des Fensters eigene Funktion aufrufen AWT, Swing, JavaFX & SWT 8
M JTable mit JCombobox eigene Auswahl pro Zeile ? AWT, Swing, JavaFX & SWT 3
T JFrame - eigene Titelleiste AWT, Swing, JavaFX & SWT 8
Y Eigene Komponente einfügen AWT, Swing, JavaFX & SWT 6
G Eigene Koponente erstellen AWT, Swing, JavaFX & SWT 3
G Eigene Componente in jScrollView einbetten AWT, Swing, JavaFX & SWT 6
T Eigene grafische Oberfläche AWT, Swing, JavaFX & SWT 7
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

Ähnliche Java Themen

Neue Themen


Oben