2013-02-17 23 views
5

Jestem zupełnie nowy w używaniu GUI w Javie, więc mam problem z ustaleniem, jak ustawić wszystko, co potrzebne. Mam panele w mojej ramce JFrame, które muszę wyrównać (jeden z lewej, jeden z prawej) i kilka przycisków w jednym z paneli, które muszę wyśrodkować w panelu. Oto mój kod.Jak mogę wyrównać elementy w JPanels/JFrames?

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)); 
     } 
    } 
} 

Jak widać, drugi JPanel (siatka) nie w jednej linii z prawej strony ramy, a przyciski wewnątrz iconTray nie wyśrodkować albo. Zdaję sobie sprawę, że są to prawdopodobnie proste poprawki układu, ale nie mam pojęcia, od czego zacząć.

Odpowiedz

7

Do prostego podziału JFrame można użyć GridLayout z rzędu 1 i 2 colums.

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

do centrowania elementów w panelach można użyć FlowLayout który jest domyślny zestaw na JPanels:

Robienie tego ręcznie:

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 

Jak to wygląda:

enter image description here

Również kilka obserwacje:

  • Nigdy nie wywołuj metod setXXXSize() dla swoich komponentów;

  • Staraj się unikać wywoływania setSize(); dla JFrame, zadzwoń pod numer pack();;

  • Zadzwoń pod setVisible(true); na końcu kodu;

Cały Twój kod może być ogromny „pozbawiony”, aby w ten sposób:

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

Dzięki, to bardzo pomogło. Jest jedna rzecz, o której zapomniałem zapytać, i to w jaki sposób wyrównać przyciski w pionie - muszę dodać trochę później. – user2067364

+1

+1 dla 'pack()'; więcej [tutaj] (http://stackoverflow.com/a/14927280/230513). – trashgod

+0

Będziesz musiał użyć innego menedżera układu. Do bardzo podstawowego dopasowania możesz użyć 'GridLayout' lub' BoxLayout', ale dla czegoś bardziej złożonego sugeruję użycie 'GridBadLayout' lub' MiGLayout'. Po prostu google to. –

1

muszę paneli w moim JFrame że muszę wyrównać (jeden po lewej, jeden w prawo) i kilka przycisków w jednym z paneli, które muszę być w środku panelu. Oto mój kod.

Zdaję sobie sprawę, że są to prawdopodobnie proste poprawki układu, ale nie mam żadnej wskazówki, od czego zacząć.

Użyj bardziej złożonego układu niż prosty FlowLayout, którego używasz. Proponuję użyć

  • GridBagLayout
  • BoxLayout

Sprawdź references here

2

Proponuję trochę czasu przechodzi A Visual Guide to Layout Managers. Pomoże to zapoznać się z menedżerami układów, które są dostępne w standardowym interfejsie API. To zajmuje trochę doświadczenia i ciężkiej pracy, aby dowiedzieć się, który z nich jest właściwym narzędziem do uzyskania pożądanego wyglądu. Gdy poczujesz się komfortowo z tym, co jest dostępne w standardowym interfejsie API, powinieneś również rozejrzeć się za interfejsami API Layout Manager innych firm, które zapewniają inne opcje.

5

jak wyrównać przyciski w pionie?

tym przykładzie wykorzystano pionowy Box w obszarze domyślnie ramy za BorderLayoutWEST:

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

Zobacz także [* Initial Threads *] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) i to [Q & A] (http://stackoverflow.com/q/7229226/ 230513). – trashgod

Powiązane problemy