# Rectangle Border Color



## Simbasi (1. Dez 2012)

Guten Abend,

ich habe ein kleines Problemchen mit der Klasse Rectangle.

Ich habe ein Diagramm mit vielen verschiedenen Graphen. Sobald der Benutzer auf das Diagramm mit der Maus klickt, kann er sich einen Bereich auswählen um dort eine Zoom-Auswahl zu treffen. 
Diese Zoom-Auswahl stelle ich zur Zeit mithilfe eines Rectangles dar, welches nicht über paintComponent gezeichnet wird, sondern über eine eigene Methode in Zusammenhand mit MouseActionListener's.
Also zum Beginn wird im Konstruktor einfach ein neues Rectangle Object angelegt mit "rect_zoom = new Rectangle();" und je nachdem was der Benutzer macht, wird dies einer Position/Grösse angepasst.

Nun das Problem:

Ich habe einen weissen Hintergrund und der Rahmen des Rectangles ist ebenfalls weiss. Nun das ist ein wenig supoptimal, da der Benutzer nun selbst nicht weiss was er genau macht!

Gibt es also eine Möglichkeit die RahmenFarbe des Rectangles vorab zu verändern?

Liebe Grüße und noch einen schönen Abend wünscht

Simbasi :*


----------



## TKausL (1. Dez 2012)

Das kommt drauf an wie das Rectangle gezeichnet wird. Das Rectangle-Object an sich tut erstmal nicht. Es stellt nur ein Rechteck dar, indem es eine Position X/Y und eine Größe width/height bereitstellt.


----------



## Simbasi (1. Dez 2012)

Gezeichnet wirds bei mir mit setBounds(x,y,width, height); Aber wie gesagt, beim zeichnen an sich liegt nicht das Problem. Eher die Farbe des Rahmes.


----------



## TKausL (1. Dez 2012)

Simbasi hat gesagt.:


> Gezeichnet wirds bei mir mit setBounds(x,y,width, height); Aber wie gesagt, beim zeichnen an sich liegt nicht das Problem. Eher die Farbe des Rahmes.



1. setBounds zeichnet nichts.
2. Ein Rectangle hat keinen Rahmen. Das was du als Rahmen bezeichnest IST das Rectangle.


----------



## Simbasi (2. Dez 2012)

Hey, 

zu 1. Hmm ok, hast recht.. setBounds setzt ja nur die Größe welche das Zeichnen brauch um es überhaupt zeichnen zu können. Entschuldige

zu 2. Danke, das wusste ich echt noch nicht. Habe gedacht das Rectangle wäre einfach ein Rechteck 

Nun, gibt es denn die Möglichkeit die Farbe des Rectangles zu verändern?


----------



## NiXPhoE (2. Dez 2012)

g(2).setColor(Color.dieFarbe);


----------



## Simbasi (3. Dez 2012)

und jetzt ohne Graphic?


----------



## Michael... (3. Dez 2012)

Simbasi hat gesagt.:


> und jetzt ohne Graphic?



Wieso ohne ohne Graphic? gezeichnet wird immer mit einem Graphics Objekt.
Wie zeichnest Du denn das Rectangle?


----------



## dayaftereh (3. Dez 2012)

Ist die Klasse [JAPI]Rectangle[/JAPI] aus der Java API oder wurde die selbst hinzugefügt. Kannst du mal den Import von Rectangle posten? Weil die Klasse Rectangle hat in der 5.0 API kein draw?


----------



## Simbasi (6. Dez 2012)

Hey,

viele scheinen wohl nicht zu wissen wie ich das meine, oder ich habe das mit dem Graphic einfach falsch verstanden. Für mich ist das so:

Wenn ich mit Graphic zeichne, zeichne ich das Rectangle über die paintComponent Methode vom JPanel, aber ich lege mir ein Object an und sobald es gebraucht wird (Beim 1. Klick) wird es auf die momentane Position mit Größe der aktuellen Mausposition mit setBounds gesetzt und ein repaint() aufgerufen.

Ich poste einfach mal meine Klasse:


```
package multidiagramm;

import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JPanel;

public class GraphZoom extends JPanel
{
    private boolean click;

    private Rectangle rect_zoom;

    private int mouse_x_start = 0;
    private int mouse_y_start = 0;
    
    private int mouse_x_end = 0;
    private int mouse_y_end = 0;
    
    Thread thread_resize;

    public GraphZoom()
    {
        this.click = false;
        
        this.rect_zoom = new Rectangle();
        
        

        this.addMouseListener(new MouseListener() 
        {

            @Override
            public void mouseClicked(MouseEvent e) {
                
                if (getMouseClick())
                {
                    setMouseClick(false);
                    
                    return;
                }
                setMouseClick(true);
                mouse_x_start = e.getX();
                mouse_y_start = e.getY();
            }

            @Override
            public void mousePressed(MouseEvent e) 
            {
            }

            @Override
            public void mouseReleased(MouseEvent e) 
            {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                
            }

            @Override
            public void mouseExited(MouseEvent e) {
               
            }
        });
        
        this.addMouseMotionListener(new MouseMotionAdapter() 
        {

            @Override
            public void mouseMoved(MouseEvent e) 
            {
                if (getMouseClick())
                {
                    mouse_x_end = e.getX();
                    mouse_y_end = e.getY();
                    if (thread_resize == null)
                    {
                        createZoomAreaThread();
                    }
                    
                    if (!thread_resize.isAlive())
                    {
                        createZoomAreaThread();
                        thread_resize.start();
                    }
                }
            }
        });

    }
    
    private void setMouseClick(boolean clicked)
    {
        this.click = clicked;
    }
    
    private boolean getMouseClick()
    {
        return this.click;
    }
    
    private void editZoomArea()
    {
        int x = 0;
        int y = 0;
        int width = 0;
        int height = 0;
        
        if (mouse_x_start < mouse_x_end)
        {
            x = mouse_x_start;
            width = mouse_x_end - mouse_x_start;
        }
        else if (mouse_x_start > mouse_x_end)
        {
            x = mouse_x_end;
            width =  mouse_x_start - mouse_x_end;
        }
        
        if (mouse_y_start < mouse_y_end)
        {
            y = mouse_y_start;
            height = mouse_y_end - mouse_y_start;
        }
        else if (mouse_y_start > mouse_y_end)
        {
            y = mouse_y_end;
            height = mouse_y_start - mouse_y_end;
        }
            
        this.rect_zoom.setBounds(x, y, width, height);
        
        this.repaint();
    }

    public Rectangle getZoomRect()
    {
        return this.rect_zoom;
    }
    
    
    private void createZoomAreaThread()
    {
        thread_resize = new Thread(new Runnable() 
        {

            @Override
            public void run() 
            {
                while(getMouseClick())
                {
                    try 
                    {
                        thread_resize.sleep(50);
                    } 
                    catch (InterruptedException ex) 
                    {
                    }
                    
                    editZoomArea();
                    
                }
                
            }
        });
    }
    
}
```


----------



## Michael... (6. Dez 2012)

In der Klasse ist keine überschriebene paintComponent?


----------



## dayaftereh (6. Dez 2012)

Ich verstehe auch nicht was du mit dem Zweiten Thread machst?


----------



## Simbasi (6. Dez 2012)

1. Nein, dort gibt es keine überschriebene paintComponent Methode. Das ist die komplette Klasse so wie sie ist. Wenn ich mir nun ein Panel erstelle und von der Klasse erbe passiert folgendes:

Der erste Klick auf das Fenster zeigt mit das Rectangle an und wie ich die Maus bewege so wird es mir dargestellt, mein 2. Klick wird der Thread gestoppt und das Rectangle bleibt auf der Größe wie es zuletzt war auf dem Fenster stehen.

2. Welcher 2. Thread? Da ist nur einer, ich muss ihn nur immer wieder erneut anlegen nachdem dieser "ausgelaufen" ist. Wenn ich also ein neues Rectangle haben möchte, muss der Thread neu erstellt werden, da diese nicht mehr erneut zu starten sind, nachdem diese einmal komplett durchgelaufen sind (Habe es vorher anders probiert, aber das ging nicht!).

Hättet ihr das anders gemacht? Gehe ich vielleicht den komplett falschen Weg?

Also das Rectangles soll wie der Klassenname schon sagt zum Zoomen eines Graphen sein. Man kann im Graphenfenster beliebig klicken, anhand der Punkte des Rectangles wird der Bereich berechnet und das ganze "gezoomt" 

P.S.: Ich glaube ich erstelle mir dann doch beim nächsten mal einen Account hier im Forum 

Liebe Grüße Simbasi


----------



## Michael... (7. Dez 2012)

Simbasi hat gesagt.:


> 1. Nein, dort gibt es keine überschriebene paintComponent Methode. Das ist die komplette Klasse so wie sie ist. Wenn ich mir nun ein Panel erstelle und von der Klasse erbe passiert folgendes:


Du hast eine Klasse die von GraphZoom erbt und hier ist die überschriebene paintComponent?


Simbasi hat gesagt.:


> Der erste Klick auf das Fenster zeigt mit das Rectangle an und wie ich die Maus bewege so wird es mir dargestellt, mein 2. Klick wird der Thread gestoppt und das Rectangle bleibt auf der Größe wie es zuletzt war auf dem Fenster stehen.


Der Thread ist hier eigentlich überflüssig. Beim ersten Klick merkst Du Dir die Mausposition und dann "verfolgst" Du einfach per MouseMotionListener die Maus und aktualisierst die zweite Ecke immer auf die aktuelle Position der Maus.

Aber egal, da wo letztendlich das Rectangle gezeichnet wird musst Du eben zuerst die Farbe des Graphics Objekts ändern, wenn der Rahmen in einer bestimmten Farbe gezeichnet werden soll.

Du benutzt nicht etwa BlueJ oder ähnliches?


----------

