2013-02-17 9 views
5

Ich bin völlig neu in der Verwendung der GUI in Java, so habe ich ein wenig Mühe herauszufinden, wie alles auszurichten, was ich brauche. Ich habe in meinem JFrame Panels, die ich ausrichten muss (Eins nach links, eins nach rechts) und ein paar Buttons in einem der Panels, die ich im Panel zentrieren muss. Hier ist mein Code.Wie kann ich Elemente in JPanels/JFrames ausrichten?

package application; 

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
import java.io.*; 
import java.nio.*; 
import java.util.*; 

public class Main extends JPanel 
{ 
    public static void main(String[] args) 
    { 
     //set the ui to the native OS 
     try 
     { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     }catch(ClassNotFoundException | InstantiationException | IllegalAccessException 
     | UnsupportedLookAndFeelException e)         
     { 
     } 

     JFrame frame = new JFrame("Application Name"); 
     Menu menu = new Menu(); 
     JPanel iconPanel = new JPanel(); 
     final JPanel grid = new JPanel(new FlowLayout()); 
     JButton firewallButton = new JButton("Firewall"); 
     JButton networkButton = new JButton("Network"); 
     JButton printerButton = new JButton("Printer"); 

     int iconPanelSizeX; 
     int iconPanelSizeY; 
     int gridSizeX; 
     int gridSizeY; 
     int gridPosition; 

     //frame setting 
     frame.setSize(800, 600); 
     frame.setMinimumSize(new Dimension(800, 600)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     //add grid and iconPanel JPanels to the frame 
     frame.add(iconPanel); 
     iconPanel.add(firewallButton); 
     iconPanel.add(networkButton); 
     iconPanel.add(printerButton); 
     frame.add(grid);   

     //iconPanel settings 
     iconPanel.setBorder(BorderFactory.createLoweredSoftBevelBorder()); 
     iconPanel.setBackground(Color.gray); 
     iconPanel.setLayout(new FlowLayout()); 
     iconPanel.setSize(new Dimension(100, 600)); 
     iconPanel.setVisible(true); 

     //grid setting 
     grid.setBackground(Color.red); 
     grid.setSize(new Dimension(700, 600)); 
     grid.setVisible(true); 

     //this is for resizing components when the user resizes the window 
     int counter = 0; 
     while(counter == 0) 
     { 
      firewallButton.setSize(new Dimension(iconPanel.getWidth(), 50)); 
      networkButton.setSize(new Dimension(iconPanel.getWidth(), 50)); 
      printerButton.setSize(new Dimension(iconPanel.getWidth(), 50)); 
      iconPanelSizeX = frame.getWidth()/10; 
      iconPanelSizeY = frame.getHeight(); 
      gridSizeX = (frame.getWidth()/10) * 9; 
      gridSizeY = frame.getHeight(); 
      iconPanel.setSize(new Dimension(iconPanelSizeX, iconPanelSizeY)); 
      grid.setSize(new Dimension(gridSizeX, gridSizeY)); 
     } 
    } 
} 

Wie Sie sehen können, die zweite JPanel (Gitter) Linie nicht mit der rechten Seite des Rahmens nach oben, und die Tasten innerhalb iconTray auch nicht zentrieren. Mir ist klar, dass es sich beide um einfache Layout-Korrekturen handelt, aber ich habe keine Ahnung, wo ich anfangen soll.

Antwort

7

Für einfache Spaltung von JFrame verwenden Sie GridLayout mit 1 Zeile und 2 Spalten verwenden können.

frame.setLayout(new GridLayout(1,2,3,3)); //3,3 are gaps 
frame.add(grid); 
frame.add(iconPanel); 

Für Komponenten in Panels Zentrierung können Sie FlowLayout verwenden, die durch Standardsatz ist auf JPanels:

es manualy tun:

grid.setLayout(new FlowLayout()); //Centered components 

grid.setLayout(new FlowLayout(FlowLayout.LEFT,3,3)); //Components aligned to left 

grid.setLayout(new FlowLayout(FlowLayout.RIGHT,3,3)); //Components aligned to right 

Dies ist, wie es aussieht:

enter image description here

Auch wenige Beobachtungen:

  • Niemals setXXXSize() -Methoden für Ihre Komponenten aufrufen;

  • Versuchen Sie zu vermeiden setSize(); für JFrame anrufen, rufen Sie pack(); stattdessen;

  • Anruf setVisible(true); am Ende des Codes;

Alle Ihre riesigen Code kann "gestrippt" sein:

import javax.swing.*; 
import java.awt.*; 


public class Main extends JPanel 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("Application Name"); 
     JPanel iconPanel = new JPanel(); 
     JPanel grid = new JPanel(new FlowLayout()); 
     JButton firewallButton = new JButton("Firewall"); 
     JButton networkButton = new JButton("Network"); 
     JButton printerButton = new JButton("Printer"); 


     frame.add(iconPanel); 
     iconPanel.add(firewallButton); 
     iconPanel.add(networkButton); 
     iconPanel.add(printerButton); 
     grid.setBackground(Color.GREEN); 

     frame.setLayout(new GridLayout(1,2,3,3)); 
     frame.add(grid); 
     frame.add(iconPanel); 


     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

Danke, das hat mir sehr geholfen. Es gibt eine Sache, die ich vergessen habe zu fragen, und das ist, wie man Tasten vertikal anordnet - ich muss später etwas hinzufügen. – user2067364

+1

+1 für 'pack()'; mehr [hier] (http://stackoverflow.com/a/14927280/230513). – trashgod

+0

Sie müssen einen anderen Layout-Manager verwenden. Für eine sehr einfache Ausrichtung können Sie 'GridLayout' oder' BoxLayout' verwenden, aber für etwas Komplexeres empfehle ich die Verwendung von 'GridBadLayout' oder' MiGLayout'. Googeln Sie das einfach. –

1

Ich muss Platten in meinem JFrame, die ich (Ein nach links, eine rechts) ausrichten müssen und ein paar Knöpfe in einer der Platten, die ich brauche in der Platte zentriert werden. Hier ist mein Code.

Ich realisiere, das sind beide wahrscheinlich einfache Layout-Fixes, aber ich habe keine Ahnung, wo ich anfangen soll.

Verwenden Sie komplexere Layout als einfach FlowLayout, die Sie tatsächlich verwenden. Ich schlage vor, Sie

  • GridBagLayout
  • BoxLayout

prüfen references here

2

Ich schlage vor, Sie einige Zeit dauern, bis A Visual Guide to Layout Managers gehen. Dadurch können Sie sich mit den Layout-Managern vertraut machen, die mit der Standard-API verfügbar sind. Es bedarf einiger Erfahrung und harter Arbeit, um herauszufinden, welches davon das richtige Werkzeug ist, um genau das gewünschte Aussehen zu erhalten. Sobald Sie sich mit den Funktionen der Standard-API vertraut gemacht haben, sollten Sie auch nach Layout Manager-APIs von Drittanbietern suchen, die weitere Optionen bieten.

5

Wie werden Tasten vertikal ausgerichtet?

In diesem Beispiel wird eine vertikale Box im WEST Bereich Verzugs des Rahmens BorderLayout:

enter image description here

import java.awt.*; 
import javax.swing.*; 

/** @see http://stackoverflow.com/a/14927280/230513 */ 
public class Main { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       display(); 
      } 
     }); 
    } 

    private static void display() throws HeadlessException { 
     JFrame frame = new JFrame("Application Name"); 
     JButton firewallButton = new JButton("Firewall"); 
     JButton networkButton = new JButton("Network"); 
     JButton printerButton = new JButton("Printer"); 

     //iconPanel settings 
     Box iconPanel = new Box(BoxLayout.Y_AXIS); 
     iconPanel.add(firewallButton); 
     iconPanel.add(networkButton); 
     iconPanel.add(printerButton); 
     iconPanel.setBackground(Color.gray); 
     iconPanel.setVisible(true); 
     frame.add(iconPanel, BorderLayout.WEST); 

     //grid setting 
     JPanel grid = new JPanel() { 

      @Override 
      // arbitrary placeholder size 
      public Dimension getPreferredSize() { 
       return new Dimension(320, 230); 
      } 
     }; 
     grid.setBackground(Color.red); 
     frame.add(grid, BorderLayout.CENTER); 

     //frame setting 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

Siehe auch [* Initial Threads *] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) und diese [Q & A] (http://stackoverflow.com/q/7229226/ 230513). – trashgod