3 Java-Probs

Dieses Thema 3 Java-Probs im Forum "Webentwicklung, Hosting & Programmierung" wurde erstellt von Michael_B, 3. Jan. 2004.

Thema: 3 Java-Probs Hallöchen Gemeinde und frohes neues Jahr... ich versuch mich gerade in die Swing-Materie einzuarbeiten. Dabei hab...

  1. Hallöchen Gemeinde und frohes neues Jahr...

    ich versuch mich gerade in die Swing-Materie einzuarbeiten. Dabei hab ich folgende Probleme.

    Zunächst möchte ich ein JFrame erzeugen (was auch kein Problem ist)...
    Code:
    JFrame frame = new JFrame(Titel);
    ...und diesem eine bestimmte Größe zuweisen. Ich hab das sowohl mit
    Code:
    frame.setSize(500, 350);
    als auch mit
    Code:
    frame.getContentPane().setSize(500,350);
    gemacht. Aber dennoch bekomm ich beim Starten nur sowas:
    [​IMG]
    Das kann ich dann nachträchlich noch vergrößern, aber das ist ja nicht der Sinn der Sache...

    Wenn ich in dem Frame noch ein Panel (z. B. zum Zeichnen) hab und dem Panel vorher nochmal ne bestimmte Größe zuweise, passiert genauso wenig...

    2.
    Wenn ich in dem Frame ein Panel drin habe und dem Panel eine Größe zuweise (diese wird über System.out sogar korrekt ausgegeben), danach den Frame beliebig vergrößere, dann vergrößert sich auch das Panel... Warum?

    3. Problem: Ich mochte einen (Netzwerk-)Graphen darstellen, mit mehreren Knoten die untereinander durch Linien verbunden sind. Diese Knoten möchte ich mit Hilfe der Maus auf dem Fenster verschieben...
    Ich hab nur leider keinen blassen Schimmer, wie ich das angehen soll...

    Für ein paar Tipps wäre ich sehr dankbar...
     
  2. Hi,

    Frame anlegen sollte in etwa so funktionieren:

    Code:
    JFrame ivFrame = new JFrame();
    ivFrame.getContentPane().setLayout(new BorderLayout());
    ivFrame.setSize(640, 480);
    ivFrame.setDefaultCloseOperation(0);
    ivFrame.setVisible(true);
    
    Setz mal anstatt des Panels ein Canvas ein. Hast dem Panel/Canvas auch eine Größe gegeben? Wird das Fenster dann richtig angezeigt? Falls das auch nicht klappt, wird es denn (testweise) mit einem großen JButton angezeigt?

    Für dein 3. Problem kann ich Dir ein Programm, dass ich mir mal geschrieben habe, und das ich beruflich gebraucht habe, zur Verfügung stellen. In diesem konnte man auch Objekte mit der Maus packen und verschieben. Es ist zwar keine Lösung für dein Problem, aber als Gedankenhilfe kann ich es Dir gerne zur Verfügung stellen. Läuft allerdings - wenn ich mich recht entsinne - noch unter Java 1.1.

    Im groben kann ich Dir allerdings schon mal folgende Hilfe geben:

    1. erstelle ein eigenes GUI Objekt (z.B. DrawablePanel), also eine Klasse die von JPanel erbt (DrawablePanel extends JPanel)

    2. hier solltest Du die paint() Methode überschreiben:

    Code:
    public void paint(Graphics g) {
    
      // hier musst Du deine eigenen Komponente zeichnen
      // d.h. Linien zeichen und Grafiken ausgeben
      // ich kann Dir dazu ein Super-Buch aus dem Addisen-Wesley Verlag empfehlen
    
    
      super.paint(g);
    }
    
    3. auf dein DrawablePanel einen MouseListener hängen, damit Du die Objekte (Grafiken, Pfeile oder was auch immer) mit der Maus greifen, verschieben und wieder loslassen kannst. Das muss aber alles selbst programmiert werden.

    4. Im MouseListener in der entsprechenden Methode das selektierte Objekt ermitteln (Mauskoordinaten sind ja bekannt)

    5. Für deine einzelen Objekte (Grafiken, Pfeile) ebentuell eigene Klassen anlegen:

    Code:
    class UIPfeil extends UIObject {
      int x;    // x-Koordinate
      int y;    // y-Koordinate
      int xende; 
      int yende;
      int zustand;   // Selektiert, Nicht selektiert, usw.
    
      // notwendige Methoden implementieren, z.B. paint(), damit dieses Object sich selbst zeichnen kann
      public void paint(Graphics g) {
         // selbst zeichnen
         g.drawLine(...);    //  <-- sorry, weiss den Befehl gerade nicht auswendig  
      }
    }
    
    ~~+~~~~+~~~~+~~~~+~~~~+~~~~+~~~~+~~~~+~~~~+~~~~+~~

    Gut, ich versuche es mal ein bisschen zusammenhängend darzustellen, aber ich programmiere jetzt schon ca. 2 oder 3 Jahre keine Java mehr und weiss daher die genaue Syntax/Parameter nicht mehr alle auswendig. Man möge es mir nachsehen.


    Code:
    
    class MyMouseListener implements MouseListener {
    DrawablePanel ivPanel = null;
    Vector uiObjects = new Vector();     // Container, der  die UI Objecte enthält
    
    public MyMouseListener(DrawablePanel p) {
    ivPanel = p;
    }
    
    // Maustaste gerade gedrückt, bin mir bei->mouseDown' nicht ganz sicher
    public void mouseDown(int x,int y) {
    // UIObject, dass sich an den Koordinaten (x,y) befindet, ermitteln
    UIObject uio = ...;
    
    uio.setZustand(1);
    
    // und jetzt dem Panel sagen dass ein Ereignis eingetreten ist und es neu gezeichnet werden soll
    ivPanel.repaint();
    }
    
    }  // end of class MyMouseListener
    
    
    class DrawablePanel extends JPanel {
    
    
    
    public DrawablePanel() {
    new MyMouseListener(this);
    }
    
    
    public void paint(Graphics2D g) {
    // alle UIObject's sich zeichnen lassen
    for(int i=0; i<uiObjects.size(); i++) {
    UIObject uio = (UIObject)uiObjects.elementAt(i);
    uio.paint(g);
    }
    
    // eventuell hier noch eigene Zeichenoperationen?
    //..
    
    // super!!
    super.paint(g);
    }
    
    }  // end of class
    
    
    class UIObject {
    int zustand;   // 0=nicht selektiert, 1=selektiert
    
    public void setZustand(int z) {
    zustand = z;
    }
    }  // end of class
    
    
    class UILini extends UIObject {
    int x,y,xende,yende;
    
    public void paint(Graphics2D g) {
    // man könnte z.B. noch die Liniefarbe in Abhängigkeit des Zustands setzen
    
    g.drawLine(x,y,xende,yende);
    
    
    super.paint(g);
    }
    }  // end of class
    
    
    Bitte beachten: bei den dargestellten Klassen handelt es sich nicht um fertige Klassen, sondern um Skizzen. Diese müssen also noch erweitert/ausgebaut oder eventuell anders modelliert werden.

    Ich hoffe ich konnte Dir einen Ansatz geben, damit Du dein Problem lösen kannst. Ich helfe gerne weiter, sofern ich kann.

    Gruß
    VoiDy
     
  3. Hallo VoiD,

    vielen Dank für deine mühevolle Arbeit... aber mittlerweile hab ich die meisten Probleme schon gelöst...

    zu 1) ich hatte nach der Initialisierung des Frames zuerst die setSize(int, int) und danach pack() aufgerufen... anders herum funktioniert es... Aber: pack() macht ja laut Manual nix anderes, als den Frame so zu vergrößern/verkleinern, dass alle Elemente sichtbar sind. Komischerweise hat es das bei mir nicht bewirkt.

    zu 3) hat ich auch schon alles erledigt...

    nochmals danke