Hallo allwissendes Java-Forum, welches mir bis jetzt auf alle Java Fragen eine Antwort wusste ....
ich bin ein blutiger Anfänger, welcher Spaßeshalber sich dieses Hobby gefunden hat.
nun zu meinem Problem, ehe eine Verständnis-frage, da sogar mit der kompliziertesten Lösung das Ziel erreicht werden kann:
Es geht um Container und den darin enthaltenen Component´s, welche gezeichnet durch paint() werden.
Im Ansatz habe ich den JComponent als Container welcher wiederum JComponent aufnimmt. als letzte Stufe ist das Canvas angelegt, welche die Position und das zu zeichnete Objekt darstellt. (Frage: ist es so richtig, da doch Canvas ein awt-Element ist und JComponent zu Swing gehört?). nun gehe ich auf den MouseListener und versuche über die SwingUtilities.getDeepestComponentAt() die Componente auf dieser Position rauszugeben, was leider nicht funktioniert, weil das Objekt ContainerObjektA kein Component von awt ist (Frage: in Component kann ich keine Components adden, also wieso sollte ich dann den Component verwendet? und wie kann ich die Componente nach Position automatisch suchen lassen?) . Gezeichnet wird das Objekt als Canvas, welcher hier von JPanel nach unten mit paint() und while Suche angesteuert wird (Frage: Warum wird Component nicht von selbst gezeichnet, also warum muss es manuell angesprochen werden?).
So nun zu der Hauptfrage: als blutiger Anfänger, der ich bin, werde ich einfach den Gedanken nicht los das diese paint Component über Container einfacher gestaltet wird, existierende Bibliotheken, Objekte...? Gibt es wirklich nur die Lösung über die Layout mit JPanel, welche weitere in sich beinhaltende JPanels aufnimmt und diese auf Position setzt, dann geht auch die SwingUtilities.getDeepestComponentAt() Methode, ToolTip usw, oder ist das unten stehende Beispiel so valide, OK, inordnung???
Also wie Ihr sehen könnt ist mein Problem die Verständnis von JComponent, Component, Canvas, JPanel mit MouseListener (Benutzerinteraktion) und Runnable. Also äußert bitte eure Erfahrung, Meinung...ich freue mich über jeden Einwand und jede neue Erkenntnis Vielen Dank
und nu der Code:
ich bin ein blutiger Anfänger, welcher Spaßeshalber sich dieses Hobby gefunden hat.
nun zu meinem Problem, ehe eine Verständnis-frage, da sogar mit der kompliziertesten Lösung das Ziel erreicht werden kann:
Es geht um Container und den darin enthaltenen Component´s, welche gezeichnet durch paint() werden.
Im Ansatz habe ich den JComponent als Container welcher wiederum JComponent aufnimmt. als letzte Stufe ist das Canvas angelegt, welche die Position und das zu zeichnete Objekt darstellt. (Frage: ist es so richtig, da doch Canvas ein awt-Element ist und JComponent zu Swing gehört?). nun gehe ich auf den MouseListener und versuche über die SwingUtilities.getDeepestComponentAt() die Componente auf dieser Position rauszugeben, was leider nicht funktioniert, weil das Objekt ContainerObjektA kein Component von awt ist (Frage: in Component kann ich keine Components adden, also wieso sollte ich dann den Component verwendet? und wie kann ich die Componente nach Position automatisch suchen lassen?) . Gezeichnet wird das Objekt als Canvas, welcher hier von JPanel nach unten mit paint() und while Suche angesteuert wird (Frage: Warum wird Component nicht von selbst gezeichnet, also warum muss es manuell angesprochen werden?).
So nun zu der Hauptfrage: als blutiger Anfänger, der ich bin, werde ich einfach den Gedanken nicht los das diese paint Component über Container einfacher gestaltet wird, existierende Bibliotheken, Objekte...? Gibt es wirklich nur die Lösung über die Layout mit JPanel, welche weitere in sich beinhaltende JPanels aufnimmt und diese auf Position setzt, dann geht auch die SwingUtilities.getDeepestComponentAt() Methode, ToolTip usw, oder ist das unten stehende Beispiel so valide, OK, inordnung???
Also wie Ihr sehen könnt ist mein Problem die Verständnis von JComponent, Component, Canvas, JPanel mit MouseListener (Benutzerinteraktion) und Runnable. Also äußert bitte eure Erfahrung, Meinung...ich freue mich über jeden Einwand und jede neue Erkenntnis Vielen Dank
und nu der Code:
Java:
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.PopupMenu;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Ausgabe extends JFrame {
/**
* Main
* @param args
*/
public static void main(String[] args) {
Ausgabe t = new Ausgabe();
t.pack();
t.setVisible(true);
}
/**
* JFrame für Start
*/
public Ausgabe() {
this.setSize(100,100);
setLayout(new BorderLayout());
addWindowListener(new ExitListener());
add(new Container0(),BorderLayout.CENTER);
}
}
/**
* Container für alle Objekte
*
*/
class Container0 extends JPanel implements Runnable{
JComponent componenteA;
public Container0(){
setPreferredSize(new Dimension(100, 100));
componenteA = new ContainerObjektA();
componenteA.setVisible(true);
add(componenteA);
addMouseListener(new MouseL());
}
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.red);
g.fillRect(this.getX(), this.getY(), this.getWidth(), this.getHeight());
Component[] gt =this.getComponents();
int i= 0;
while (i< gt.length){
gt[i].paint(g);
i++;
}
System.out.println("Test Übergeordneter Container");
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("RUN nicht verwendet");
}
}
/**
* Container für gleichartige positionsverschiedene Objekte
*
*/
class ContainerObjektA extends JComponent{
Componente componenteA0;
Componente componenteA1;
public ContainerObjektA (){
setPreferredSize(new Dimension(100, 100));
componenteA0 = new Componente();
componenteA1 = new Componente(20,40);
componenteA0.setVisible(true);
componenteA1.setVisible(true);
add(componenteA0);
add(componenteA1);
}
public void paint(Graphics g){
Component[] gt =this.getComponents();
int i= 0;
while (i< gt.length){
gt[i].paint(g);
i++;
}
System.out.println("Test Container");
}
}
/**
* Objekt selbs, mit paint-Eigenschafen
*
*/
class Componente extends Canvas {
private int width=10;
private int height=10;
private int x=10;
private int y=10;
public Componente(){
super();
add( new PopupMenu("test"));
setLocation(x, y);
setBackground(Color.GREEN);
contains(x, y);
}
public Componente(int f, int g){
setBackground(Color.blue);
setLocation(f, g);
contains(f, g);
}
@Override
public void paint(Graphics g){
System.out.println("Test Objekt: " + getLocation());
g.setColor(getBackground());
g.fillRect( getLocation().x, getLocation().y, width, height);
}
}
/**
* Mauslistener für den Container mit allen Objekten
*
*/
class MouseL implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
Component c = SwingUtilities.getDeepestComponentAt(
e.getComponent(), e.getX(), e.getY());
System.out.println("get Component: " + c);
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
/**
*
* Exitlistener für Fenster
*/
class ExitListener extends WindowAdapter {
public void windowClosing(WindowEvent event) {
System.exit(0);
}
}