2015-06-15 91 views
0

我想创建一个图形用户界面使用Java的BMR计算器。嵌套FlowLayout面板

我在使用GUI方面遇到了一些问题,所以我一直在尝试使用不同的布局管理器/嵌套Jpanels。

我目前的代码有一个年龄和性别标签,都包含在流布局中的单独JPanel中,但问题在于它们出现在彼此旁边,而不是像我希望的那样在单独的行上。

我该如何使用我的代码实现这个功能?我目前的laoyut如下,我希望性别低于年龄,并且已经玩了一段时间,但无法使其工作。

干杯。

enter image description here

package v2; 

import javax.swing.*; 

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.FlowLayout; 




public class BmrCalcv2 extends JFrame { 

static JFrame mainFrame; 
static JPanel mainPanel; 

static JMenuBar menuBar; 
static JMenu fileMenu, editMenu; 

static JPanel agePanel; 
private JLabel ageLabel; 
private JTextField ageTextField; 

static JPanel genderPanel; 
private JLabel genderLabel; 




public BmrCalcv2() { 

    // Main JFrame 
    mainFrame = new JFrame("BMR/TDEE Calculator"); 
    mainPanel = new JPanel(); 


    // All JPanel declarations 
    menuBar = new JMenuBar(); 
    agePanel = new JPanel(); 
    genderPanel = new JPanel(); 

    // JPanel layout managers 
    agePanel.setLayout(new FlowLayout(10)); 
    genderPanel.setLayout(new FlowLayout(10)); 


    // Menu JPanel 
    fileMenu = new JMenu("File"); 
    editMenu = new JMenu("Edit"); 
    menuBar.add(fileMenu); 
    menuBar.add(editMenu); 

    // Age JPanel 
    ageLabel = new JLabel("Age:"); 
    ageTextField = new JTextField(5); 
    agePanel.add(ageLabel); 
    agePanel.add(ageTextField); 



    // Gender JPanel 
    genderLabel = new JLabel("Gender:"); 
    genderPanel.add(genderLabel); 



    // Adding sub JPanels to main JPanel 
    mainPanel.add(agePanel); 
    mainPanel.add(genderPanel); 


    // Adding main JPanel/menubar to JFrame 
    mainFrame.setJMenuBar(menuBar); 
    mainFrame.add(mainPanel); 

} 





public static void main(String[] args) { 

    BmrCalcv2 frame = new BmrCalcv2(); 

    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    mainFrame.setVisible(true); 
    mainFrame.setSize(330, 300);; 
    mainFrame.setResizable(false); 

    } 

} 
+1

对于标签/字段对,我会推荐'GridBagLayout'或['GroupLayout'](http://stackoverflow.com/a/21659516/418556)。 –

+0

你会推荐我为每个字段/标签组使用一个JPanel还是一个? – user3186023

+0

@ Ftahir192在这种情况下,最可能的是 – MadProgrammer

回答

0

像这样的东西应该这样做:

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.ButtonGroup; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.JTextField; 

public class GridBagLayoutExample { 

    public static void main(String[] args) { 
     init(); 
    } 

    private static void init() { 
     // create the jframe 
     JFrame jframe = new JFrame("BMI Calculator"); 
     // create the gui elements 
     JLabel ageLabel = new JLabel("Age:"); 
     JTextField ageTxt = new JTextField(20); 
     JLabel genderLabel = new JLabel("Gender:"); 
     JTextField genderTxt = new JTextField(20); 
     // create gridbag layout and constraints 
     GridBagLayout gbl = new GridBagLayout(); 
     // create the panel using the gbl 
     JPanel pan = new JPanel(gbl); 
     // create the constraints 
     GridBagConstraints cons = new GridBagConstraints(); 
     cons.fill = GridBagConstraints.HORIZONTAL; 
     // age label 
     cons.gridx = 0; 
     cons.gridy = 0; 
     pan.add(ageLabel, cons); 
     // age text 
     cons.gridx = 1; 
     cons.gridy = 0; 
     pan.add(ageTxt, cons); 
     // gender label 
     cons.gridx = 0; 
     cons.gridy = 1; 
     pan.add(genderLabel, cons); 
     // gender text 
     cons.gridx = 1; 
     cons.gridy = 1; 
     pan.add(genderTxt, cons); 
     // add the panel to the jframe 
     jframe.add(pan, BorderLayout.CENTER); 
     // show the jframe 
     jframe.setSize(400, 200); 
     jframe.setVisible(true); 
    } 
} 

是这样的:

enter image description here

0

如果你不关心对齐方式:

mainFrame.getContentPane().setLayout(new BoxLayout(mainFrame.getContentPane(), BoxLayout.X_AXIS)); 
// quick pseudocode incoming 
for(int x = 0; x < components.size(); x++) { 
    JPanel j = new JPanel(); 
    j.setLayout(new FlowLayout(FlowLayout.CENTER)); // I think CENTER is the default anyhow 
    j.add(getLabel(x)); 
    j.add(getField(x)); 
    mainFrame.add(j); 
} 

如果您关心对齐,请沿着Y_AXIS替换FlowLayout以获得BoxLayout,并在标签和输入字段之间放置一些水平胶。