I want to create a simple food ordering system, now i'm creating the interface of an order form. I used GridBagLayout for create the form layout, my problem is when I want to assign 3 radio button in same row, it's only show me 1 of the button....I hope somebody can help me pls....
Here is my java code:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
/**
*
* #author user
*/
public class ChickenChopOrderingSystem
{
JFrame frame;
JPanel mainPanel, p1, p2, p3, p4;
JLabel lblTitle, lblName, lblPhoneNum, lblFlavour, lblChickenPart;
JTextField txtName, txtPhoneNum;
String flavour[] = {"Black Pepper Sauce", "Hainanese", "Grilled", "Lemon"};
JComboBox box;
ButtonGroup bg = new ButtonGroup();
JRadioButton btnWhole, btnHalf, btnQuarter;
JButton btnDone, btnExit;
public ChickenChopOrderingSystem()
{
frame = new JFrame("Chicken Chop Ordering System");
mainPanel = new JPanel();
mainPanel.setPreferredSize(new Dimension(700,700));
mainPanel.setBackground(Color.yellow);
lblName = new JLabel("Customer's Name: ");
txtName = new JTextField(20);
lblPhoneNum = new JLabel("Phone Number: ");
txtPhoneNum = new JTextField(11);
lblChickenPart = new JLabel("Select Part of Chicken: ");
btnWhole = new JRadioButton("Whole");
btnWhole.addItemListener(new OperationListener());
btnHalf = new JRadioButton("Half");
btnHalf.addItemListener(new OperationListener());
btnQuarter = new JRadioButton("Quarter");
btnQuarter.addItemListener(new OperationListener());
bg.add(btnWhole);
bg.add(btnHalf);
bg.add(btnQuarter);
lblFlavour = new JLabel("Select a flavour: ");
box = new JComboBox(flavour);
btnDone = new JButton("Done");
btnExit = new JButton("Exit");
btnExit.addActionListener(new ButtonListener());
//GridBaglayout
mainPanel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
//Label
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.5;
gbc.weighty = 0.5;
mainPanel.add(lblName, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 0.5;
mainPanel.add(lblPhoneNum, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 2;
gbc.weightx = 0.5;
mainPanel.add(lblChickenPart, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 3;
gbc.weightx = 0.5;
mainPanel.add(lblFlavour, gbc);
//TextField
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 3;
mainPanel.add(txtName, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 1;
gbc.gridwidth = 3;
mainPanel.add(txtPhoneNum, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 2;
mainPanel.add(btnWhole, gbc);
gbc.gridx = 2;
gbc.gridy = 2;
mainPanel.add(btnHalf, gbc);
gbc.gridx = 3;
gbc.gridy = 2;
mainPanel.add(btnHalf, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 3;
mainPanel.add(box, gbc);
//frame setting
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
frame.add(mainPanel, new GridBagConstraints());
frame.setSize(new Dimension(1000, 1000));
frame.setVisible(true);
}
public class OperationListener implements ItemListener
{
#Override
public void itemStateChanged(ItemEvent ie) {
if (ie.getSource() == btnWhole)
{
if (ie.getStateChange() == ItemEvent.SELECTED)
{
box.removeAllItems();
box.addItem(flavour[2]);
}
} if (ie.getSource() == btnHalf)
{
if (ie.getStateChange() == ItemEvent.SELECTED)
{
box.removeAllItems();
box.addItem(flavour[0]);
box.addItem(flavour[2]);
box.addItem(flavour[3]);
}
} if (ie.getSource() == btnQuarter)
{
if (ie.getStateChange() == ItemEvent.SELECTED)
{
box.removeAllItems();
box.addItem(flavour[0]);
box.addItem(flavour[1]);
box.addItem(flavour[3]);
}
}
}
}
public class ButtonListener implements ActionListener
{
#Override
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == btnExit)
{
int s = JOptionPane.showConfirmDialog(null, "Are you sure you want to exit?",
"Exit", JOptionPane.YES_NO_OPTION);
if (s == JOptionPane.YES_OPTION)
{
System.exit(0);
}
}
}
}
public static void main(String[] args)
{
ChickenChopOrderingSystem run = new ChickenChopOrderingSystem();
}
}
Click here to view output
For something like this:
Use this code:
import java.awt.*;
import javax.swing.*;
public class ChickenChopOrderingSystem {
JFrame frame;
JPanel mainPanel, p1, p2, p3, p4;
JLabel lblTitle, lblName, lblPhoneNum, lblFlavour, lblChickenPart;
JTextField txtName, txtPhoneNum;
String flavour[] = {"Black Pepper Sauce", "Hainanese", "Grilled", "Lemon"};
JComboBox box;
ButtonGroup bg = new ButtonGroup();
JRadioButton btnWhole, btnHalf, btnQuarter;
JButton btnDone, btnExit;
public ChickenChopOrderingSystem() {
frame = new JFrame("Chicken Chop Ordering System");
mainPanel = new JPanel();
// GUESSWORK!
//mainPanel.setPreferredSize(new Dimension(700,700));
mainPanel.setBackground(Color.yellow);
lblName = new JLabel("Customer's Name: ");
txtName = new JTextField(20);
lblPhoneNum = new JLabel("Phone Number: ");
txtPhoneNum = new JTextField(11);
lblChickenPart = new JLabel("Select Part of Chicken: ");
btnWhole = new JRadioButton("Whole");
btnHalf = new JRadioButton("Half");
btnQuarter = new JRadioButton("Quarter");
bg.add(btnWhole);
bg.add(btnHalf);
bg.add(btnQuarter);
lblFlavour = new JLabel("Select a flavour: ");
box = new JComboBox(flavour);
btnDone = new JButton("Done");
btnExit = new JButton("Exit");
//GridBaglayout
mainPanel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
int s = 20;
gbc.insets = new Insets(s,s,s,s);
//Label
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 0.5;
gbc.weighty = 0.5;
mainPanel.add(lblName, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 0.5;
mainPanel.add(lblPhoneNum, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 2;
gbc.weightx = 0.5;
mainPanel.add(lblChickenPart, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 3;
gbc.weightx = 0.5;
mainPanel.add(lblFlavour, gbc);
//TextField
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 3;
mainPanel.add(txtName, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 1;
gbc.gridwidth = 3;
mainPanel.add(txtPhoneNum, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 2;
gbc.gridwidth = 1;
gbc.weightx = 1d/6d;
mainPanel.add(btnWhole, gbc);
gbc.gridx = 2;
gbc.gridy = 2;
mainPanel.add(btnHalf, gbc);
gbc.gridx = 3;
gbc.gridy = 2;
mainPanel.add(btnQuarter, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 1;
gbc.gridy = 3;
gbc.gridwidth = 3;
mainPanel.add(box, gbc);
//frame setting
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
frame.add(mainPanel, new GridBagConstraints());
// GUESSWORK!
//frame.setSize(new Dimension(1000, 1000));
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
ChickenChopOrderingSystem run = new ChickenChopOrderingSystem();
}
}
The problems in the original code were many. (Trawling memory..)
The constraints of the last element were not set back to grid width of 3, confusing the layout manager.
The ItemListener was doing strange stuff with removing components, don't do that.
The preferred size of the panel, and the size of the frame, were guesswork. Use pack() to have the correct size calculated. (Add a standard Inserts to the initial constraints for white space.)
Related
Trying to align a form next to my JTable with GridBagLayout and I am struggling to get my components to the top of the panel. I need the price label and fields just underneath the item label and field but I cannot get it to move from the bottom of the panel.
If I use anchor = GridConstraints.NORTHWEST, this moves the item label and field to the top, but then I lose the ability to anchor it with LINE_END. Unless there is a way to do both? Please see my image where I have attempted to demonstrate the area I want to place my form. Appreciate any help.
GridBagConstraints gbc = new GridBagConstraints();
// TEST COMPONENTS
JLabel lblItem = new JLabel("Item: ");
JLabel lblPrice = new JLabel("Price: ");
JLabel lblQuantity = new JLabel ("Quantity: ");
JTextField itemField = new JTextField(15);
JTextField pricePoundsField = new JTextField(3);
JTextField pricePenceField = new JTextField(2);
JTextField quantityField = new JTextField(3);
gbc.gridx = 0;
gbc.gridy = 0;
//gbc.weightx = 1.0;
//gbc.weighty = 1.0;
gbc.anchor = GridBagConstraints.LINE_START;
panelStockTable.add(jsp, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.LINE_END;
panelStockTable.add(lblItem, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
panelStockTable.add(lblPrice, gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx = 2;
gbc.gridy = 0;
panelStockTable.add(itemField, gbc);
gbc.gridx = 2;
gbc.gridy = 1;
panelStockTable.add(pricePoundsField, gbc);
The more complex a UI becomes, the more you want to focus on isolating the functionality and layouts to their own containers/classes.
This is where the concept of compounding layouts becomes very powerful. Rather then laying the fields out directly onto the same container as the table, use a separate container for them
Here, the right panel is standing in for the table and the blue panel is demonstrating the compounding container...
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
#Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
JPanel stockTableProxy = new JPanel() {
#Override
public Dimension getPreferredSize() {
return new Dimension(200, 150);
}
};
stockTableProxy.setBackground(Color.RED);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.LINE_START;
add(stockTableProxy, gbc);
JPanel fieldsPanel = new JPanel(new GridBagLayout());
fieldsPanel.setBackground(Color.BLUE);
// TEST COMPONENTS
JLabel lblItem = new JLabel("Item: ");
JLabel lblPrice = new JLabel("Price: ");
JLabel lblQuantity = new JLabel("Quantity: ");
JTextField itemField = new JTextField(15);
JTextField pricePoundsField = new JTextField(3);
JTextField pricePenceField = new JTextField(2);
JTextField quantityField = new JTextField(3);
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.LINE_END;
fieldsPanel.add(lblItem, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
fieldsPanel.add(lblPrice, gbc);
gbc.anchor = GridBagConstraints.LINE_START;
gbc.gridx = 2;
gbc.gridy = 0;
fieldsPanel.add(itemField, gbc);
gbc.gridx = 2;
gbc.gridy = 1;
fieldsPanel.add(pricePoundsField, gbc);
gbc.gridx = 0;
gbc.gridy = 20;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weighty = 1;
fieldsPanel.add(new JLabel(), gbc);
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.LINE_END;
gbc.fill = GridBagConstraints.VERTICAL;
add(fieldsPanel, gbc);
}
}
}
But wait, there is more...
gbc.gridx = 0;
gbc.gridy = 20;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weighty = 1;
fieldsPanel.add(new JLabel(), gbc);
This is a little trick you can use to force component to move to different edges of the container, here, I've used it to push all the fields to the top of the container.
All it does is add a transparent component (in this a JLabel) and provides all the left over space to it, neat
I already made a button group for gender, but still both radio buttons were being enabled. I tried interchanging the group of gender to yearlevel. The yearlevel does fine and still the gender both radio buttons being enabled.
here's my code:
public class myFirstGUI extends JFrame {
JPanel panel = new JPanel();
JLabel lblName = new JLabel("Name:");
JLabel lblyl = new JLabel("Year Level:");
JLabel lblCourse = new JLabel("Course:");
JLabel lblProg = new JLabel("Program:");
JLabel lblGender = new JLabel("Gender:"); //Gender
JTextField txtName = new JTextField();
JButton btnSubmit = new JButton("Submit");
JButton btnReset = new JButton("Reset");
GridBagLayout gLayout = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
JComboBox cboProgram = new JComboBox();
JRadioButton rbtn1 = new JRadioButton("1st");
JRadioButton rbtn2 = new JRadioButton("2nd");
JRadioButton rbtn3 = new JRadioButton("3rd");
JRadioButton rbtn4 = new JRadioButton("4th");
JRadioButton rbtn5 = new JRadioButton("5th");
JRadioButton rbtnM = new JRadioButton("Male"); //Gender Male
JRadioButton rbtnF = new JRadioButton("Female"); //Gender Female
JCheckBox chk003a = new JCheckBox("ITE003A");
JCheckBox chk003 = new JCheckBox("CPE003");
JCheckBox chk201 = new JCheckBox("CS201");
ButtonGroup bg = new ButtonGroup();
ButtonGroup bg1 = new ButtonGroup();
public void setYearLevel() {
bg1.add(rbtn1);
bg1.add(rbtn2);
bg1.add(rbtn3);
bg1.add(rbtn4);
bg1.add(rbtn5);
}
public void setGender() { //Gender
bg.add(rbtnM);
bg.add(rbtnF);
}
public void setProgram() {
cboProgram.addItem("CPE");
cboProgram.addItem("IE");
cboProgram.addItem("ECE");
}
public myFirstGUI() {
setYearLevel();
setProgram();
setSize(300, 500);
panel.setBackground(Color.CYAN);
setTitle("My First GUI");
add(panel);
panel.setLayout(gLayout);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.ipadx = 10;
gbc.gridx = 0;
gbc.gridy = 0;
panel.add(lblName, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
panel.add(txtName, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
panel.add(lblGender, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
panel.add(rbtnM, gbc);
gbc.gridx = 1;
gbc.gridy = 2;
panel.add(rbtnF, gbc);
rbtnM.setBackground(Color.cyan);
rbtnF.setBackground(Color.cyan);
gbc.gridx = 0;
gbc.gridy = 3;
panel.add(lblProg, gbc);
gbc.gridx = 1;
gbc.gridy = 3;
panel.add(cboProgram, gbc);
chk003a.setBackground(Color.cyan);
chk003.setBackground(Color.cyan);
chk201.setBackground(Color.cyan);
gbc.gridx = 0;
gbc.gridy = 4;
panel.add(lblCourse, gbc);
gbc.gridx = 1;
gbc.gridy = 4;
panel.add(chk003a, gbc);
gbc.gridx = 1;
gbc.gridy = 5;
panel.add(chk003, gbc);
gbc.gridx = 1;
gbc.gridy = 6;
panel.add(chk201, gbc);
gbc.gridx = 0;
gbc.gridy = 7;
panel.add(lblyl, gbc);
gbc.gridx = 1;
gbc.gridy = 7;
panel.add(rbtn1, gbc);
gbc.gridx = 1;
gbc.gridy = 8;
panel.add(rbtn2, gbc);
gbc.gridx = 1;
gbc.gridy = 9;
panel.add(rbtn3, gbc);
gbc.gridx = 1;
gbc.gridy = 10;
panel.add(rbtn4, gbc);
gbc.gridx = 1;
gbc.gridy = 11;
panel.add(rbtn5, gbc);
rbtn1.setBackground(Color.cyan);
rbtn2.setBackground(Color.cyan);
rbtn3.setBackground(Color.cyan);
rbtn4.setBackground(Color.cyan);
rbtn5.setBackground(Color.cyan);
gbc.gridx = 0;
gbc.gridy = 12;
panel.add(btnReset, gbc);
gbc.gridx = 1;
gbc.gridy = 12;
panel.add(btnSubmit, gbc);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btnSubmit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(myFirstGUI.this, "Welcome " + txtName.getText() +
"\nProgram " + cboProgram.getSelectedItem() +
"\nYear Level: " + getYL());
}
});
btnReset.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
txtName.setText("");
bg.clearSelection();
bg1.clearSelection();
cboProgram.setSelectedIndex(0);
}
});
}
public String getYL() {
if (rbtn1.isSelected())
return "1st";
else if (rbtn2.isSelected())
return "2nd";
else if (rbtn3.isSelected())
return "3rd";
else if (rbtn4.isSelected())
return "4th";
else if (rbtn5.isSelected())
return "5th";
else
return "Please select your level";
}
public static void main(String[] args) {
new myFirstGUI().show();
}
}
I am not sure if you have pasted an incomplete code here or not as I Don't see a call to setGender() function from your program. Since the radio buttons are not assigned to the button group, that can cause the problem.
If you are asking why your JRadioButton for Male are Female are both being selected, this is what you can do.
ButtonGroup group = new ButtonGroup();
group.add(btnM);
group.add(btnF);
You need to group the radio buttons which belong to the same category (group).
After adding them to a group, only one JRadioButton will be selected.
I keep getting 2 mini windows popping up. I don't see none of my components from the Jpanel class. I've tried everything I could.. I know I'm doing something wrong but I can't seem to find the bug.
Here's my Jpanel class
public class ComponentsPanel extends JPanel
{
// variable declarations
// constructor
public ComponentsPanel()
{
panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
pLabel = new javax.swing.JLabel("Policy #");
gbc.gridx = 0;
gbc.gridy = 0;
panel.add(pLabel, gbc);
pTextField = new javax.swing.JTextField();
pTextField.setSize(10, 10);
gbc.gridx = 1;
gbc.gridy = 0;
panel.add(pTextField, gbc);
this.pNum = pTextField.getText();
newbLabel = new javax.swing.JLabel("NB Date");
gbc.gridx = 0;
gbc.gridy = 1;
panel.add(newbLabel, gbc);
newbTextField = new javax.swing.JTextField();
gbc.gridx = 1;
gbc.gridy = 1;
panel.add(newbTextField, gbc);
newbButton = new javax.swing.JButton("NEW DATE");
gbc.gridx = 2;
gbc.gridy = 1;
panel.add(newbButton, gbc);
this.newbDate = newbTextField.getText();
biLabel = new javax.swing.JLabel("BI Limits");
gbc.gridx = 0;
gbc.gridy = 2;
panel.add(biLabel, gbc);
biTextField = new javax.swing.JTextField();
gbc.gridx = 1;
gbc.gridy = 2;
panel.add(biTextField, gbc);
bilimButton = new javax.swing.JComboBox<>(bilimits);
bilimButton.setToolTipText("Choose Verified BILimits");
gbc.gridx = 2;
gbc.gridy = 2;
panel.add(bilimButton, gbc);
bicslButton = new javax.swing.JComboBox<>(bicsl);
gbc.gridx = 3;
gbc.gridy = 2;
panel.add(bicslButton, gbc);
this.biLimit = biTextField.getText();
lapseLabel = new javax.swing.JLabel("Lapse #");
gbc.gridx = 0;
gbc.gridy = 3;
panel.add(lapseLabel, gbc);
lapseTextField = new javax.swing.JTextField();
gbc.gridx = 1;
gbc.gridy = 3;
panel.add(lapseTextField, gbc);
lapseButton = new javax.swing.JComboBox<>(lapse);
for (int i = 0; i < lapse.length; i++)
{
lapse[i] = Integer.toString(i);
if (i < 10)
lapse[i] = "0" + Integer.toString(i);
}
lapseButton.setModel(new DefaultComboBoxModel(lapse));
gbc.gridx = 2;
gbc.gridy = 3;
panel.add(lapseButton, gbc);
this.lapses = lapseTextField.getText();
noChangeButton = new javax.swing.JButton("NO CHANGE");
gbc.gridx = 0;
gbc.gridy = 4;
panel.add(noChangeButton, gbc);
changeButton = new javax.swing.JButton("CHANGE");
gbc.gridx = 1;
gbc.gridy = 4;
panel.add(changeButton, gbc);
decButton = new javax.swing.JButton("DECREASE");
gbc.gridx = 2;
gbc.gridy = 4;
panel.add(decButton, gbc);
incButton = new javax.swing.JButton("INCREASE");
gbc.gridx = 3;
gbc.gridy = 4;
panel.add(incButton, gbc);
cpyButton = new javax.swing.JButton("COPY");
cpyButton.setToolTipText("copy comment");
gbc.gridx = 0;
gbc.gridy = 5;
panel.add(cpyButton, gbc);
clrButton = new javax.swing.JButton("CLEAR");
clrButton.setToolTipText("clear all fields");
gbc.gridx = 3;
gbc.gridy = 5;
panel.add(clrButton, gbc);
dispTextArea = new javax.swing.JTextArea(10,10);
dispTextArea.setEditable(true);
dispTextArea.setLineWrap(true);
dispTextArea.setColumns(20);
dispTextArea.setRows(5);
panel.add(dispTextArea);
gbc.gridx = 0;
gbc.gridy = 6;
gbc.weightx = 0.5;
gbc.gridwidth = 4;
gbc.anchor = GridBagConstraints.PAGE_END;
panel.add(dispTextArea,gbc);
// adding listeners to components
// registering all components with their respective listeners
CompHandler compHandler = new CompHandler();
pTextField.addActionListener(compHandler);
biTextField.addActionListener(compHandler);
newbTextField.addActionListener(compHandler);
bilimButton.addActionListener(compHandler);
bicslButton.addActionListener(compHandler);
noChangeButton.addActionListener(compHandler);
changeButton.addActionListener(compHandler);
decButton.addActionListener(compHandler);
incButton.addActionListener(compHandler);
decButton.addActionListener(compHandler);
cpyButton.addActionListener(compHandler);
clrButton.addActionListener(compHandler);
}
// class to handle text fields
private class CompHandler implements ActionListener
{
#Override
public void actionPerformed(ActionEvent e) {}
} // end component handler class
}
Here's my Jframe class with the main method:
public class MyWindow extends JFrame
{
public MyWindow()
{
super ("FNA");
setSize(300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ComponentsPanel pane = new ComponentsPanel();
add(pane);
setVisible(true);
}
public static void main(String[] args)
{
// TODO code application logic here
} // end of main
In your ComponentsPanel you create an instance of JPanel call panel, but never add it to anything.
Unless you're doing a more complex layout, you could just get rid of it and add you components directly to the ComponentsPanel itself
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class MyWindow extends JFrame
{
public MyWindow()
{
super("FNA");
setSize(300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ComponentsPanel pane = new ComponentsPanel();
add(pane);
setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
#Override
public void run()
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex)
{
ex.printStackTrace();
}
new MyWindow();
}
});
}
public class ComponentsPanel extends JPanel
{
private final JLabel pLabel;
private final String pNum;
private final String newbDate;
private final String biLimit;
private final String lapses;
// variable declarations
// constructor
public ComponentsPanel()
{
GridBagConstraints gbc = new GridBagConstraints();
pLabel = new javax.swing.JLabel("Policy #");
gbc.gridx = 0;
gbc.gridy = 0;
add(pLabel, gbc);
JTextField pTextField = new javax.swing.JTextField();
pTextField.setSize(10, 10);
gbc.gridx = 1;
gbc.gridy = 0;
add(pTextField, gbc);
this.pNum = pTextField.getText();
JLabel newbLabel = new javax.swing.JLabel("NB Date");
gbc.gridx = 0;
gbc.gridy = 1;
add(newbLabel, gbc);
JTextField newbTextField = new javax.swing.JTextField();
gbc.gridx = 1;
gbc.gridy = 1;
add(newbTextField, gbc);
JButton newbButton = new javax.swing.JButton("NEW DATE");
gbc.gridx = 2;
gbc.gridy = 1;
add(newbButton, gbc);
this.newbDate = newbTextField.getText();
JLabel biLabel = new javax.swing.JLabel("BI Limits");
gbc.gridx = 0;
gbc.gridy = 2;
add(biLabel, gbc);
JTextField biTextField = new javax.swing.JTextField();
gbc.gridx = 1;
gbc.gridy = 2;
add(biTextField, gbc);
JComboBox<Object> bilimButton = new javax.swing.JComboBox<>();
bilimButton.setToolTipText("Choose Verified BILimits");
gbc.gridx = 2;
gbc.gridy = 2;
add(bilimButton, gbc);
JComboBox<Object> bicslButton = new javax.swing.JComboBox<>();
gbc.gridx = 3;
gbc.gridy = 2;
add(bicslButton, gbc);
this.biLimit = biTextField.getText();
JLabel lapseLabel = new javax.swing.JLabel("Lapse #");
gbc.gridx = 0;
gbc.gridy = 3;
add(lapseLabel, gbc);
JTextField lapseTextField = new javax.swing.JTextField();
gbc.gridx = 1;
gbc.gridy = 3;
add(lapseTextField, gbc);
JComboBox<Object> lapseButton = new javax.swing.JComboBox<>();
// for (int i = 0; i < lapse.length; i++)
// {
// lapse[i] = Integer.toString(i);
// if (i < 10)
// {
// lapse[i] = "0" + Integer.toString(i);
// }
// }
// lapseButton.setModel(new DefaultComboBoxModel(lapse));
gbc.gridx = 2;
gbc.gridy = 3;
add(lapseButton, gbc);
this.lapses = lapseTextField.getText();
JButton noChangeButton = new javax.swing.JButton("NO CHANGE");
gbc.gridx = 0;
gbc.gridy = 4;
add(noChangeButton, gbc);
JButton changeButton = new javax.swing.JButton("CHANGE");
gbc.gridx = 1;
gbc.gridy = 4;
add(changeButton, gbc);
JButton decButton = new javax.swing.JButton("DECREASE");
gbc.gridx = 2;
gbc.gridy = 4;
add(decButton, gbc);
JButton incButton = new javax.swing.JButton("INCREASE");
gbc.gridx = 3;
gbc.gridy = 4;
add(incButton, gbc);
JButton cpyButton = new javax.swing.JButton("COPY");
cpyButton.setToolTipText("copy comment");
gbc.gridx = 0;
gbc.gridy = 5;
add(cpyButton, gbc);
JButton clrButton = new javax.swing.JButton("CLEAR");
clrButton.setToolTipText("clear all fields");
gbc.gridx = 3;
gbc.gridy = 5;
add(clrButton, gbc);
JTextArea dispTextArea = new javax.swing.JTextArea(10, 10);
dispTextArea.setEditable(true);
dispTextArea.setLineWrap(true);
dispTextArea.setColumns(20);
dispTextArea.setRows(5);
add(dispTextArea);
gbc.gridx = 0;
gbc.gridy = 6;
gbc.weightx = 0.5;
gbc.gridwidth = 4;
gbc.anchor = GridBagConstraints.PAGE_END;
add(dispTextArea, gbc);
// adding listeners to components
// registering all components with their respective listeners
CompHandler compHandler = new CompHandler();
pTextField.addActionListener(compHandler);
biTextField.addActionListener(compHandler);
newbTextField.addActionListener(compHandler);
bilimButton.addActionListener(compHandler);
bicslButton.addActionListener(compHandler);
noChangeButton.addActionListener(compHandler);
changeButton.addActionListener(compHandler);
decButton.addActionListener(compHandler);
incButton.addActionListener(compHandler);
decButton.addActionListener(compHandler);
cpyButton.addActionListener(compHandler);
clrButton.addActionListener(compHandler);
}
// class to handle text fields
private class CompHandler implements ActionListener
{
#Override
public void actionPerformed(ActionEvent e) {}
} // end component handler class
}
}
I have this layout using GridBagLayout:
public class Example extends JFrame {
public Example() {
Border outline = BorderFactory.createLineBorder(Color.black);
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
JPanel pane = new JPanel(gbl);
gbc.weighty = 1.0;
gbc.weightx = 1.0;
JLabel unitLbl = new JLabel("Unit");
unitLbl.setBorder(outline);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.ipadx = 30;
gbc.ipady = 10;
gbl.setConstraints(unitLbl, gbc);
pane.add(unitLbl);
JLabel typeLbl = new JLabel("Type");
typeLbl.setBorder(outline);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.ipadx = 30;
gbc.ipady = 10;
gbl.setConstraints(typeLbl, gbc);
pane.add(typeLbl);
JTextField unitField = new JTextField();
typeLbl.setBorder(outline);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.ipadx = 30;
gbc.ipady = 10;
gbl.setConstraints(unitField, gbc);
pane.add(unitField);
String[] type = {"All", "Verb", "Noun", "Adjective"};
JComboBox<String> comboBox = new JComboBox<String>(type);
gbc.gridx = 1;
gbc.gridy = 1;
gbc.ipadx = 30;
gbc.ipady = 10;
gbl.setConstraints(comboBox, gbc);
pane.add(comboBox);
add(pane, BorderLayout.CENTER);
setSize(new Dimension(400, 300));
getContentPane().setBackground(Color.WHITE);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
#Override
public void run() {
new Example();
}
});
}
}
In this example, when run, It seems that every component is at the center of the frame. But what I want is :
Two JLabel (unitLbl and typelbl) will be on the left of frame
JTextField and JComboBox will be on the right of two JLabel, respectively with a small distance between.
Moreover, I want to add a new JButton at location (3,0) of the grid, but the height of this location sum of two JLabel height. It means, this button height is on "two line".
How can I fix this code to achieve this goal ? Please help me.
Thanks :)
Something like this should do the trick:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Example extends JFrame {
public Example() {
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
JPanel pane = new JPanel(gbl);
gbc.anchor = GridBagConstraints.WEST;
JLabel unitLbl = new JLabel("Unit");
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(3, 3, 3, 30);
gbl.setConstraints(unitLbl, gbc);
pane.add(unitLbl);
JLabel typeLbl = new JLabel("Type");
gbc.gridx = 0;
gbc.gridy = 1;
gbl.setConstraints(typeLbl, gbc);
pane.add(typeLbl);
gbc.weightx = 1.0;
gbc.insets = new Insets(3, 3, 3, 3);
JTextField unitField = new JTextField();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(unitField, gbc);
pane.add(unitField);
String[] type = { "All", "Verb", "Noun", "Adjective" };
JComboBox<String> comboBox = new JComboBox<String>(type);
gbc.gridx = 1;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.NONE;
gbl.setConstraints(comboBox, gbc);
pane.add(comboBox);
final JButton someButton = new JButton("Click me");
someButton.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(someButton, "You have clicked " + someButton.getText());
}
});
gbc.gridx = 3;
gbc.gridy = 0;
gbc.gridheight = 2;
gbc.fill = GridBagConstraints.VERTICAL;
pane.add(someButton, gbc);
add(pane, BorderLayout.CENTER);
setSize(new Dimension(400, 300));
getContentPane().setBackground(Color.WHITE);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
#Override
public void run() {
new Example();
}
});
}
}
You need to use appropriately weightx/weighty (how is the extra horizontal/vertical space redistributed)
Use the appropriate fill attribute (is the component stretched vertically/horizontally/both?)
Use the appropriate anchor attribute (if the component is not stretched, or at least not in both direction, where should it be located within its cell)
I usually prefer to use insets instead of padding, therefore, I prefer insets over ipadx/ipady (extra white-space should be added around the component or inside the component)
You want to use GridBagConsraints#anchor to define the position within the cell that you want to align the component to.
To allow a component to span over number of cells, you want to use GridBagConstraints#gridwidth and GridBagConstraints#gridheight (the default is 1)
public class TestLayout09 {
public static void main(String[] args) {
new TestLayout09();
}
public TestLayout09() {
EventQueue.invokeLater(new Runnable() {
#Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new LayoutPane());
frame.setBackground(Color.WHITE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class LayoutPane extends JPanel {
public LayoutPane() {
Border outline = BorderFactory.createLineBorder(Color.black);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
// I'm not sure this really is what you want, but I may be mistaken
// gbc.weighty = 1.0;
// gbc.weightx = 1.0;
JLabel unitLbl = new JLabel("Unit");
unitLbl.setBorder(outline);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.ipadx = 30;
gbc.ipady = 10;
gbc.anchor = GridBagConstraints.WEST;
add(unitLbl, gbc);
JLabel typeLbl = new JLabel("Type");
typeLbl.setBorder(outline);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.ipadx = 30;
gbc.ipady = 10;
add(typeLbl, gbc);
JTextField unitField = new JTextField();
typeLbl.setBorder(outline);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.ipadx = 30;
gbc.ipady = 10;
gbc.anchor = GridBagConstraints.EAST;
add(unitField, gbc);
String[] type = {"All", "Verb", "Noun", "Adjective"};
JComboBox<String> comboBox = new JComboBox<String>(type);
gbc.gridx = 1;
gbc.gridy = 1;
gbc.ipadx = 30;
gbc.ipady = 10;
add(comboBox, gbc);
JButton btn = new JButton("Test");
gbc.gridx = 3;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridheight = 2;
add(btn, gbc);
}
}
}
Some answers:
Put the anchor for unitlbl to WEST.
gbc.anchor = GridBagConstraints.WEST;
And the anchor for unitField to EAST.
gbc.anchor = GridBagConstraints.EAST;
And for the button:
JButton button = new JButton("Test");
gbc.fill = GridBagConstraints.VERTICAL;
gbc.gridx = 3;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 2;
gbc.weighty = 1;
pane.add(button, gbc);
Please have a look at the following code
package email;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SendEmail extends JDialog
{
private JLabel to, cc, bcc, subject, account;
private JTextField toTxt, ccTxt, bccTxt, subjectTxt;
private JTextArea messageTxt;
private JButton send;
private JComboBox accountBox;
private JScrollPane scroll;
private GridBagLayout gbl;
private GridBagConstraints gbc;
public SendEmail()
{
//Declaring instance variables
to = new JLabel("To: ");
cc = new JLabel("CC: ");
bcc = new JLabel("BCC: ");
subject = new JLabel("Subject: ");
account = new JLabel("Select an Account: ");
toTxt = new JTextField(20);
ccTxt = new JTextField(20);
bccTxt = new JTextField(20);
subjectTxt = new JTextField(20);
messageTxt = new JTextArea(500,500);
scroll = new JScrollPane(messageTxt);
accountBox = new JComboBox();
accountBox.addItem("Yahoo");
accountBox.addItem("GMail");
accountBox.addItem("MSN");
//accountBox.addItem("Yahoo");
//accountBox.addItem("Yahoo");
//Creating thr GUI
gbl = new GridBagLayout();
gbc = new GridBagConstraints();
this.setLayout(gbl);
gbc.gridx = 1;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.BOTH;
this.add(account,gbc);
gbc.gridx = 2;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.BOTH;
this.add(accountBox,gbc);
gbc.gridx = 1;
gbc.gridy = 2;
gbc.fill = GridBagConstraints.BOTH;
this.add(to,gbc);
gbc.gridx = 2;
gbc.gridy = 2;
gbc.fill = GridBagConstraints.BOTH;
this.add(toTxt,gbc);
gbc.gridx = 1;
gbc.gridy = 3;
gbc.fill = GridBagConstraints.BOTH;
this.add(bcc,gbc);
gbc.gridx = 2;
gbc.gridy = 3;
gbc.fill = GridBagConstraints.BOTH;
this.add(bccTxt,gbc);
gbc.gridx = 1;
gbc.gridy = 4;
gbc.fill = GridBagConstraints.BOTH;
this.add(cc,gbc);
gbc.gridx = 2;
gbc.gridy = 4;
gbc.fill = GridBagConstraints.BOTH;
this.add(ccTxt,gbc);
gbc.gridx = 1;
gbc.gridy = 5;
gbc.fill = GridBagConstraints.BOTH;
this.add(subject,gbc);
gbc.gridx = 2;
gbc.gridy = 5;
gbc.fill = GridBagConstraints.BOTH;
this.add(subjectTxt,gbc);
gbc.gridx = 1;
gbc.gridy = 6;
gbc.fill = GridBagConstraints.BOTH;
this.add(scroll,gbc);
this.setSize(new Dimension(200,500));
this.setVisible(true);
}
}
In here, the GUI seems very bad. I need to have enough space for all the fields. In the JTextArea, you can see it is not even visible. I need it's height to be 2 columns; it seems like all these problems are occurring because it is trying to set the large JTextArea to one column. For your information, this is an "Compose Email" GUI, so you can be clear of what I am asking. I used this.pack() but it made everything worst!
As I mentioned above in the comments:
Don't call setSize(). Instead pack() the GUI and let the component's natural preferred sizes and the layouts dictate the size of the GUI. If pack() makes things worse, then you should fix the problem from that side of things, not by calling setSize().
For instance, I would
make the JTextArea a reasonable size, not 500 rows by 500 cols!
Don't set size of things
Do call pack()
Don't forget to use weightx and weighty (added to the code) and insets (not yet added).
Avoid magic numbers.
Consider nesting easier to use layouts and minimizing use of GridBagLayout.
Give the JScrollPane extra gridwidth to allow it to fill up the bottom. For instance:
SendEmail.java:
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;
#SuppressWarnings("serial")
public class SendEmail extends JDialog {
public final static String[] LABEL_TEXTS = { "Select an Account:", "To:",
"BCC:", "CC:", "Subject:" };
public final static String[] ACCOUNT_TEXTS = { "Yahoo", "GMail", "MSN" };
private static final int TEXT_FIELD_LENGTH = 20;
private static final int T_AREA_ROWS = 20;
private static final int T_AREA_COLS = 50;
private static final int INSET_GAP = 1;
private static final int RIGHT_INSET_GAP = 15;
private Map<String, JTextField> fieldMap = new HashMap<String, JTextField>();
private JTextArea messageTxt;
private JButton send;
private JComboBox<String> accountBox;
private JScrollPane scroll;
public SendEmail(JFrame frame) {
super(frame, "Dialog", true);
messageTxt = new JTextArea(T_AREA_ROWS, T_AREA_COLS);
scroll = new JScrollPane(messageTxt);
accountBox = new JComboBox<String>(ACCOUNT_TEXTS);
this.setLayout(new GridBagLayout());
int ebGap = 5;
((JPanel) getContentPane()).setBorder(BorderFactory.createEmptyBorder(
ebGap, ebGap, ebGap, ebGap));
for (int i = 0; i < LABEL_TEXTS.length; i++) {
JLabel label = new JLabel(LABEL_TEXTS[i]);
addLabel(0, i, label);
if (i == 0) {
addField(1, i, accountBox);
} else {
JTextField tField = new JTextField(TEXT_FIELD_LENGTH);
fieldMap.put(LABEL_TEXTS[i], tField);
addField(1, i, tField);
}
}
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = LABEL_TEXTS.length;
gbc.gridwidth = 2;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(INSET_GAP, INSET_GAP, INSET_GAP, INSET_GAP);
this.add(scroll, gbc);
pack();
this.setVisible(true);
}
private void addField(int x, int y, JComponent comp) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(INSET_GAP, INSET_GAP, INSET_GAP, INSET_GAP);
gbc.anchor = GridBagConstraints.EAST;
this.add(comp, gbc);
}
private void addLabel(int x, int y, JComponent comp) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(INSET_GAP, INSET_GAP, INSET_GAP, RIGHT_INSET_GAP);
gbc.anchor = GridBagConstraints.EAST;
this.add(comp, gbc);
}
public String getTextFieldText(String key) {
JTextField tField = fieldMap.get(key);
if (tField == null) {
String text = "key, " + key + " not a valid argument for fieldMap";
throw new IllegalArgumentException(text);
}
return tField.getText();
}
public String getAccountText() {
return accountBox.getSelectedItem().toString();
}
public String getMessageTxt() {
return messageTxt.getText();
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
new SendEmail(frame);
frame.dispose();
}
}
which when run would look like: