# Individueller Frame-Rahmen



## Foermchen82 (11. Mrz 2010)

Gibt es eine Möglichkeit den Rahmen eines Frames zu bearbeiten?

Wenn ich mir das neue Office oder den Google-Chrome anschaue, haben die einen anderen Rahmen als Standard-Anwendungen.

Wenn sie jedoch hängen, sieht man den normalen Rahmen.

Ich weiß, dass man einen Frame als undecorated setzen kann und somit den Rahmen abstellen kann, aber kann man ihn auch verändern?


----------



## The_S (11. Mrz 2010)

Du kannst den Rahmen mit setUndecorated(true) ausblenden, dass ist richtig. Anschließend steht es dir natürlich frei, einen eigenen Rahmen zu zeichnen. Das ist jedoch nicht ganz trivial.


----------



## Foermchen82 (11. Mrz 2010)

Genau das möcht ich aber gern wissen wie das geht!

Wo finde ich dazu etwas?


----------



## The_S (11. Mrz 2010)

Du zeichnest dir deinen Rahmen in der paint/paintComponent Methode deiner Rahmen-Komponente(n) selbst, legst diese rund um dein ContentPane (bspw. mit einem BorderLayout) und reagierst auf die Mausaktionen durch Hinzufügen von Mouse(Motion)Listenern an deine Rahmen-Komponente(n).


----------



## Foermchen82 (11. Mrz 2010)

Das heißt aber, dass ich alle Framefunktionalitäten verliere! Denn der Rahmen liegt nun innerhalb der Contentpane und nicht außen herum. Eine Toolbar und ein Menu ist nun nicht mehr einfach einfügbar.


----------



## The_S (11. Mrz 2010)

ja


----------



## Foermchen82 (11. Mrz 2010)

nicht schön *g*


----------



## The_S (11. Mrz 2010)

Alternativ könntest du den Rahmen natürlich durch extra Windows realisieren, die du  um dein eigentliches Window rumlegst und mit selbigen "synchronisierst".


----------



## Foermchen82 (11. Mrz 2010)

wie meinst du das?
Meinst du, ich baue ein AWT.Window ohne Rahmen. Den zeichne ich selbst, und dann packe ich mein undecorated JFrame da rein, bei dem ich dann Menu und ToolBar einbauen kann?


----------



## Tomate_Salat (11. Mrz 2010)

Foermchen82 hat gesagt.:


> Eine Toolbar und ein Menu ist nun nicht mehr einfach einfügbar.



Doch sind sie, ich hab auch mal soetwas gemacht (nur kein eigener Rahmen). Da hat meine toolbar auch gleichzeitig noch ein paar mehr funktionen zugewiesen bekommen (wie z.B. doppeklick auf hintergrund=> maximieren/minimieren, dann kamen noch die minimier/maximier/schließen-icons dazu. War aber schon ein stück Arbeit, die Resize-funktion habe ich nicht nachgebaut^^)


----------



## Foermchen82 (11. Mrz 2010)

Kannst du mir das mal schicken?

Ich kann mir nicht vorstellen wie das geht. Der Rahmen sitzt doch dann in der COntentPane. Toolbar und Menu sind darüber. Das will ich natürlich nicht. Beides soll schon im Rahmen liegen


----------



## Tomate_Salat (11. Mrz 2010)

Ich hab da aber keinen Rahmen drin gezeichnet

Der Rahmen wird zwangsläufig auf das ContentPane gezeichnet


----------



## The_S (12. Mrz 2010)

Foermchen82 hat gesagt.:


> wie meinst du das?
> Meinst du, ich baue ein AWT.Window ohne Rahmen. Den zeichne ich selbst, und dann packe ich mein undecorated JFrame da rein, bei dem ich dann Menu und ToolBar einbauen kann?



Du hast oben ein Window (Window ist hier stellvertretend für irgendeine Fensterkomponente), das die Statusleiste zeichnest, du hast links, rechts und unten ein Window für den Rahmen. In der mitte liegt dein eigentliches, undekoriertes Window. Die Windows musst du natürlich (dauerhaft) so platzieren, dass es den anschein erweckt, dass du nur ein einziges Window hast.


----------



## Foermchen82 (12. Mrz 2010)

Ok, das ist mir dann doch etwas zu oversized. Dann leb ich halt mit dem standard OS Rahmen.

Trotzdem danke für die Ideen


----------



## Tomate_Salat (12. Mrz 2010)

The_S hat gesagt.:


> Du hast oben ein Window (Window ist hier stellvertretend für irgendeine Fensterkomponente), das die Statusleiste zeichnest, du hast links, rechts und unten ein Window für den Rahmen. In der mitte liegt dein eigentliches, undekoriertes Window. Die Windows musst du natürlich (dauerhaft) so platzieren, dass es den anschein erweckt, dass du nur ein einziges Window hast.



verstehe ich das richtig: Du willst das aus 5 Fensterkomponentenbauen?! :shock:

Wieso so kompliziert?! Einfach mittels [c]setUndecorated[/c] die ränder ausblenden. Dann eine Komponente erstellen die vom JPanel oder JComponent erbt. Die paintComponent() so anpassen, dass die gewünschten Ränder gezeichnet werden. 

Oder noch einfacher:
undecorated -> borderlayout -> 5 JPanel:
4 davon eine Farbe geben, diese als ränder platzieren(NORTH,SOUTH,EAST,WEST) und das 5te Panel dient als contantPanel. Das kommt logischerweise in die Mitte (Center). auf die 4 äußeren ränder kann man dann noch prima mouselistener und den kram adden. Das obere fungiert als Titelleiste.

Dazu würde ich halt noch die add-Methode überschreiben, dass sie die Komponenten auch wirklich immer auf das 5.te JPanel addet.

Nix mit Fensterkomponenten...


----------



## Foermchen82 (12. Mrz 2010)

Und wie bekomm ich dann ein JMenu oder eine JToolbar da rein?? Die kann man doch nicht auf nen Panel packen


----------



## Tomate_Salat (12. Mrz 2010)

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;

public class OwnBorders
    extends JFrame
{
    private static final long serialVersionUID = 1L;

    // Komponenten
    private JPanel left, right, bottom;
    public  JPanel content;
    
    public JToolBar toolbar;
    
    
    public OwnBorders()
    {
        setUndecorated(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        
        setLocation(100, 100);
        
        left    = new JPanel();
        right   = new JPanel();
        bottom  = new JPanel();
        content = new JPanel();
        
        content.setPreferredSize(new Dimension(300, 300));
        
        left.setOpaque(true);
        left.setBackground(Color.black);
        left.setPreferredSize(new Dimension(5, 0));                             
        
        right.setOpaque(true);
        right.setBackground(Color.black);
        right.setPreferredSize(new Dimension(5, 0));           
        
        bottom.setOpaque(true);
        bottom.setBackground(Color.black);
        bottom.setPreferredSize(new Dimension(0, 5));
        
        toolbar = new JToolBar();
        JMenu menu      = new JMenu("Datei");                        
        toolbar.add(menu);        
        //toolbar.setBackground(Color.black);
        
        
        add( toolbar, BorderLayout.NORTH );
        add( left, BorderLayout.EAST );
        add( right, BorderLayout.WEST );
        add( bottom, BorderLayout.SOUTH );
        
        add( content );
        
        pack();
    }
    
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run() 
            {
                new OwnBorders().setVisible(true);
            }
        });
    }
}
```

Nur so als Beispiel. Natürlich sollte man das noch anpassen, aber du brauchst keinen dekorierten Frame um eine Toolbar oder MenuBar zu adden. Musst sie halt u.U grafisch anpassen, aber ansonsten ist das kein Problem. Bei meinem Projekt diente die MenuBar auch als TitelBar und hatte auch alle Funktionen die eine normale Titelbar hat. (Die Idee hatte ich von Photoshop CS4 übernommen  )

*Edit* Oder du machst oben auch ein JPanel hin. Daraus eine Toolbar zu machen sollte kein Problem sein ;-)


----------



## The_S (12. Mrz 2010)

Tomate_Salat hat gesagt.:


> verstehe ich das richtig: Du willst das aus 5 Fensterkomponentenbauen?! :shock:



ja



Tomate_Salat hat gesagt.:


> Oder noch einfacher:
> undecorated -> borderlayout -> 5 JPanel:
> 4 davon eine Farbe geben, diese als ränder platzieren(NORTH,SOUTH,EAST,WEST) und das 5te Panel dient als contantPanel. Das kommt logischerweise in die Mitte (Center). auf die 4 äußeren ränder kann man dann noch prima mouselistener und den kram adden. Das obere fungiert als Titelleiste.



War auch mein initialer Vorschlag, aber Förmchen hat die Lösung nicht gepasst, deshalb die Alternative. Kann man übrigens alles in diesem Thread nachlesen  .


----------



## Tomate_Salat (12. Mrz 2010)

The_S hat gesagt.:


> ja


^^ es wäre zwar wahrscheinl. nicht mal schwer aber einfach nur brutal umständlich



> War auch mein initialer Vorschlag, aber Förmchen hat die Lösung nicht gepasst, deshalb die Alternative. Kann man übrigens alles in diesem Thread nachlesen  .



dazu müsste ich aber hochscrollen ich glaubs dir mal :wink:


----------



## The_S (12. Mrz 2010)

Tomate_Salat hat gesagt.:


> Nur so als Beispiel. Natürlich sollte man das noch anpassen, aber du brauchst keinen dekorierten Frame um eine Toolbar oder MenuBar zu adden. Musst sie halt u.U grafisch anpassen, aber ansonsten ist das kein Problem. Bei meinem Projekt diente die MenuBar auch als TitelBar und hatte auch alle Funktionen die eine normale Titelbar hat. (Die Idee hatte ich von Photoshop CS4 übernommen  )
> 
> *Edit* Oder du machst oben auch ein JPanel hin. Daraus eine Toolbar zu machen sollte kein Problem sein ;-)



Und das ist genau das, was er nicht wollte. Ist doch extrem hässlich ... und genau das wollte er vermeiden: Eine Toolbar oder ein JMenu kann nicht mehr ohne weiteres geadded werden!


----------



## Tomate_Salat (12. Mrz 2010)

The_S hat gesagt.:


> Und das ist genau das, was er nicht wollte. Ist doch extrem hässlich... und genau das wollte er vermeiden



Nun ja, wenn er eine 0815-lösung will, dann hat er sie ja jetzt. Von nix kommt nix, entweder er nimmt sich die Zeit für seine GUI oder er solls bleiben lassen. Aber so wie es mir rüberkam, hat ihn die Idee von 5 fenstern erschreckt.



> Eine Toolbar oder ein JMenu kann nicht mehr ohne weiteres geadded werden!


Natürlich, kommt nur darauf an, wie ers macht. Wenn er eine MenuBar haben will, dann sollte er diese auch als TitelBar benutzen, dann passt das.

*Edit:*

Das oben ist auch nur eine JMenuBar:


----------



## Foermchen82 (12. Mrz 2010)

Hey, wer sagt, dass mir etwas nicht passt? Alle Vorschläge haben was, aber sie sind halt nur teilweise recht aufwändig!!

Ich hab noch ne andre Idee. Kann man nicht folgendes machen:

1. ein undecorated Frame.
2. darin ein Panel mit meiner eigenen Border.
3. Im dieses Panel packe ich dann eine JRootPane.

Damit sollte ich im Panel eine JmenuBar und eine JToolbar hinzufügen können. Oder nicht??

@Tomate_Salat
warum denn so genervt? Man kann doch mal über verschiedene Vorschläge diskutieren, oder?


----------



## The_S (12. Mrz 2010)

Tomate_Salat hat gesagt.:


> Nun ja, wenn er eine 0815-lösung will, dann hat er sie ja jetzt. Von nix kommt nix, entweder er nimmt sich die Zeit für seine GUI oder er solls bleiben lassen. Aber so wie es mir rüberkam, hat ihn die Idee von 5 fenstern erschreckt.



Dass das Ausbauungsfähig ist, ist mir auch klar. Darum gings nicht. Aber deine Toolbar überdeckt beim Andocken Teile des Borders. Das ist bspw. hässlich.



Tomate_Salat hat gesagt.:


> Natürlich, kommt nur darauf an, wie ers macht. Wenn er eine MenuBar haben will, dann sollte er diese auch als TitelBar benutzen, dann passt das.



Und das ist total unpraktikabel. Eine JMenuBar als TitleBar? Schwachsinn ... ich will mein Menu nicht in der Titelbar liegen haben. Ich will da den Frame-Titel haben, Buttons für minimieren, maximieren und schließen, und die Möglichkeit das Fenster zu verschieben und größer/kleiner zu machen. Und kein Menü.


----------



## Tomate_Salat (12. Mrz 2010)

@Foermchen

pass doch einfach meinen code an:

```
package org;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;

public class OwnBorders
    extends JFrame
{
    private static final long serialVersionUID = 1L;

    // Komponenten
    private JPanel top, left, right, bottom;
    public  JRootPane content;
    
    public JMenuBar toolbar;    
    
    public OwnBorders()
    {
        setUndecorated(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        
        setLocation(100, 100);
        
        left    = new JPanel();
        right   = new JPanel();
        bottom  = new JPanel();
        top     = new JPanel();
        content = new JRootPane();
        
        content.setPreferredSize(new Dimension(300, 300));
        
        left.setOpaque(true);
        left.setBackground(Color.black);
        left.setPreferredSize(new Dimension(5, 0));                             
        
        right.setOpaque(true);
        right.setBackground(Color.black);
        right.setPreferredSize(new Dimension(5, 0));           
        
        bottom.setOpaque(true);
        bottom.setBackground(Color.black);
        bottom.setPreferredSize(new Dimension(0, 5));
        
        top.setOpaque(true);
        top.setBackground(Color.black);
        top.setPreferredSize(new Dimension(0, 20));
        
        toolbar = new JMenuBar();
        JMenu menu      = new JMenu("Datei");
        menu.add(new JMenuItem("Neu"));
        toolbar.add(menu);        
        //toolbar.setBackground(Color.black);
        
        content.setJMenuBar(toolbar);
        
        add( top, BorderLayout.NORTH );
        add( left, BorderLayout.EAST );
        add( right, BorderLayout.WEST );
        add( bottom, BorderLayout.SOUTH );
        
        add( content );
        
        pack();
    }    
    
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run() 
            {
                new OwnBorders().setVisible(true);
            }
        });
    }
}
```



The_S hat gesagt.:


> Dass das Ausbauungsfähig ist, ist mir auch klar. Darum gings nicht. Aber deine Toolbar überdeckt beim Andocken Teile des Borders. Das ist bspw. hässlich.


Die Toolbar sollte nur demonstrieren, dass sie verwendbar ist. Dass es hässlich ist, bestreite ich deswegen auch nicht ;-) 





> Und das ist total unpraktikabel. Eine JMenuBar als TitleBar?



Klar gibt schöneres aber störend nicht zwingend. Wie gesagt: schau dir mal photoshop cs4, flash cs4 o.ä. an, Die machen es auch so


----------



## Foermchen82 (12. Mrz 2010)

@Tomate_Salat
ah, ich hab nicht gesehen, dass du die RootPane schon genau so verwendest. Sorry.

Die MenuBar als Title zu verwenden ist Ansichtssache. Aber du hast recht, dass es mache so machen. Aber im Prinzip sind wir uns ja hier alle einig, dass es nicht ganz trivial ist, aber geht. Man muss nur ein paar Interna kennen!!

Ich lass mir das mal alles auf der Zunge zergehen und mir damit ne Lösung stricken. 

Danke an alle.

PS: und wieder bin ich etwas schlauer *g*


----------



## The_S (12. Mrz 2010)

Tomate_Salat hat gesagt.:


> Die Toolbar sollte nur demonstrieren, dass sie verwendbar ist. Dass es hässlich ist, bestreite ich deswegen auch nicht ;-)



Klar funktionierts. Aber wenn jemand so etwas seinen Kunden vorsetzt, jagt dieser den Vorsetzer quer durch die Stadt! Darum gings (zumindest für mich).



Tomate_Salat hat gesagt.:


> Klar gibt schöneres aber störend nicht zwingend. Wie gesagt: schau dir mal photoshop cs4, flash cs4 o.ä. an, Die machen es auch so



Ich kauf mir jetzt keine teuren Programme, nur um irgendetwas zu sehen. Schau dir mal Google Chrome an (kostet nix und ist gute Software  ), da gibts sowas, was der Threadsteller möchte!


----------



## Foermchen82 (12. Mrz 2010)

The_S hat gesagt.:


> Klar funktionierts. Aber wenn jemand so etwas seinen Kunden vorsetzt, jagt dieser den Vorsetzer quer durch die Stadt! Darum gings (zumindest für mich).
> 
> 
> 
> Ich kauf mir jetzt keine teuren Programme, nur um irgendetwas zu sehen. Schau dir mal Google Chrome an (kostet nix und ist gute Software  ), da gibts sowas, was der Threadsteller möchte!



du hast es!!!


----------



## Tomate_Salat (12. Mrz 2010)

> Ich kauf mir jetzt keine teuren Programme, nur um irgendetwas zu sehen. Schau dir mal Google Chrome an (kostet nix und ist gute Software  ), da gibts sowas, was der Threadsteller möchte!



mein Standartbrowser. Brachte nur Photoshop als beispiel, weil ich es zuerst dort gesehen hatte und dies dann schlichtweg übernahm. Und Ja Google Chrome macht es ja so ähnl.


----------

