2013-02-17 48 views
5

我完全新的在Java中使用的图形用户界面,所以我有一点麻烦搞清楚如何使我需要的一切。我要在我的JFrame面板,我需要对齐(其中一个向左,一个向右)和我需要在面板为中心的面板之一几个按钮。这是我的代码。我该如何调整在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)); 
     } 
    } 
} 

正如你可以看到,第二的JPanel(网格)不与帧的右侧排队,和内部iconTray的按钮不能任一中心。我意识到这些都可能是简单的布局修复,但我不知道从哪里开始。

回答

7

对于JFrame简单的拆分可以使用GridLayout一个1行2个colums。

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

对于面板为中心的组件,你可以使用FlowLayout这是默认设置上JPanels

做它manualy:

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 

这是它的外观:

enter image description here

另外,很少观察:

  • 永远不要为您的组件调用setXXXSize()方法;

  • 尽量避免拨打setSize();代替JFrame,改为拨打pack();;

  • 在代码结束时调用setVisible(true);;

你所有的庞大的代码可以被“剥离”这样的:

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

谢谢,这帮助了很多。实际上有一件事我忘了问,那就是如何垂直对齐按钮 - 我必须稍后添加一些按钮。 – user2067364 2013-02-17 23:07:33

+1

用于'pack()'的+1;更多[这里](http://stackoverflow.com/a/14927280/230513)。 – trashgod 2013-02-17 23:21:01

+0

您将不得不使用其他布局管理器。对于非常基本的对齐,你可以使用'GridLayout'或'BoxLayout',但对于更复杂的东西,我建议使用'GridBadLayout'或'MiGLayout'。只是谷歌。 – 2013-02-17 23:21:07

1

我要在我的JFrame面板,我需要对齐(其中一个向左, 一到右),我需要 在面板中心的面板之一几个按钮。这是我的代码。

我知道这些都可能是简单的布局解决方法,但我没有 线索从哪里开始。

使用比您实际使用的简单FlowLayout更复杂的布局。我建议你使用

  • GridBagLayout
  • BoxLayout

检查references here

2

我建议你花些时间去A Visual Guide to Layout Managers。这将帮助您熟悉标准API提供的布局管理器。需要一些经验和辛勤的工作才能弄清楚哪一个是正确的工具来获得你想要的确切外观。一旦您对Standard API提供的内容感到满意,您还应该查看提供其他选项的第三方Layout Manager API。

5

如何垂直对齐按钮?

这个例子中WEST区域框架的默认BorderLayout的使用垂直Box

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

另请参阅[*初始线程*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)和此[问与答](http://stackoverflow.com/q/7229226/ 230513)。 – trashgod 2013-02-17 23:22:48

相关问题