2015-06-15 125 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,並在標籤和輸入字段之間放置一些水平膠。