2016-06-30 12 views
1

Ich bin ein GUI-Layout für meine Anwendung mit dem Gitter Tasche und ich versuche, mit einer Funktion zum Layout jedes Element zu kommen, so dass ich nicht wieder eingeben müssen gleiche Gittertasche Code immer und immer wieder. Ich möchte diesen Code neu zu schreiben:Java-Funktion zum Erstellen von GUI-Panel

GridBagLayout gridbag = new GridBagLayout(); 
GridBagConstraints bc = new GridBagConstraints(); 
this.setLayout(gridbag); 

bc.fill = GridBagConstraints.HORIZONTAL; 
bc.anchor = GridBagConstraints.WEST; 
bc.insets = new Insets(0, 10, 10, 0); 
bc.gridx = 0; 
bc.gridy = 0; 
bc.gridwidth = 1; 
this.add(programNameLabel, bc); 

so, dass sie eine Funktion wie diese Aufruf geschrieben werden kann:

labelPosition(GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST, 0, 10, 10, 0, 0, 0, 1, programNameLabel); 

Hier ist die Funktion, die ich für die Aufgabe geschrieben haben.

protected void labelPosition(int axis, int direction, int insetOne, int insetTwo, int insetThree, int insetFour, int gridX, int gridY, int gridWidth, JLabel name) 
    { 
     GridBagLayout gridbag = new GridBagLayout(); 
     GridBagConstraints bc = new GridBagConstraints(); 
     this.setLayout(gridbag); 

     bc.fill = axis; 
     bc.anchor = direction; 
     bc.insets = new Insets(insetOne, insetTwo, insetThree, insetFour); 
     bc.gridx = gridX; 
     bc.gridy = gridY; 
     bc.gridwidth = gridWidth; 
     this.add(name, bc); 
    } 

Jetzt kompiliert es, aber wenn ich es laufe, funktioniert es nicht. Alle Labels werden in einer einzigen Zeile und nicht nach dem Layout angezeigt, nach dem ich suche.

Ist was ich versuche zu tun einfach möglich oder fehle ich etwas in meinem Code ?? Irgendwelche Vorschläge?

Antwort

2

Sie erstellen bei jedem Aufruf Ihrer Methode eine neue GridBagLayout(). Sie sollten dies nur einmal tun, und in Ihrer Methode erstellen Sie nur die GridBagConstraints und fügen Sie die neue Bezeichnung zu Ihrem Container (und, Btw, mit einem allgemeineren Typ wie JComponent können Sie die gleiche Methode auch für andere Komponenten als JLabel wiederverwenden):

protected void addComponent(int axis, int direction, int insetOne, int insetTwo, int insetThree, int insetFour, 
          int gridX, int gridY, int gridWidth, JComponent component) { 

    GridBagConstraints bc = new GridBagConstraints(); 

    bc.fill = axis; 
    bc.anchor = direction; 
    bc.insets = new Insets(insetOne, insetTwo, insetThree, insetFour); 
    bc.gridx = gridX; 
    bc.gridy = gridY; 
    bc.gridwidth = gridWidth; 

    this.add(component, bc); 
} 

... 
GridBagLayout gridbag = new GridBagLayout(); 
this.setLayout(gridbag); 

addComponent(GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST, 0, 10, 10, 0, 0, 0, 1, new JLabel("Hello")); 
addComponent(GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST, 0, 10, 10, 0, 0, 1, 1, new JButton("World")); 
... 

auf einer Seite zur Kenntnis, wenn dies ein neues Projekt ist, könnten Sie bei JavaFX statt Schaukel suchen.

+1

Ich sehe. Ich lasse den Aufruf von GridBagLayout() in der Funktion, in der ich meine labelPosition() -Funktion aufruft, und den Aufruf von Constraints() nur zu der neuen Funktion verschieben. Ich bin froh, dass es geklappt hat. Das hat ungefähr 100 Codezeilen aus dieser Datei herausgeworfen und sie viel lesbarer gemacht. Danke für den Andreas. – tworley1977

Verwandte Themen