Individueller Frame-Rahmen

Foermchen82

Top Contributor
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?
 
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.
 
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).
 
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.
 
Alternativ könntest du den Rahmen natürlich durch extra Windows realisieren, die du um dein eigentliches Window rumlegst und mit selbigen "synchronisierst".
 
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?
 
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^^)
 
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
 
Ich hab da aber keinen Rahmen drin gezeichnet

Der Rahmen wird zwangsläufig auf das ContentPane gezeichnet
 
Zuletzt bearbeitet von einem Moderator:
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.
 
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...
 
Java:
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 ;-)
 
Zuletzt bearbeitet von einem Moderator:
verstehe ich das richtig: Du willst das aus 5 Fensterkomponentenbauen?! :shock:

ja

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 😉 .
 
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!
 
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:

j87zfcu9.gif
 
Zuletzt bearbeitet von einem Moderator:
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?
 
Zuletzt bearbeitet:
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.

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ü.
 
@Foermchen

pass doch einfach meinen code an:
Java:
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);
            }
        });
    }
}

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
 
@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*
 
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).

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!
 
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!!!
 
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.
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben