Messed-up GUI: Lot of Blank Space - java

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:

Related

JRadioButton is not show properly

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.)

GridBagLayout - Vertically positioning components

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

can't get my panel on my frame.. what did i do wrong?

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

how to add a TiltledBorder in a GridBagLayout?

I am trying to make an UI with Swing using only one Container with the GridBagLayout !
My problem is that I want to regroup some JtextFields and Jlabels under one title (TitledBorder) in my interface, is there a way to add the border directly in my container, or should I create another JPanel to regroup my components and then add the hole Panel to my GridBagLayout ?
Based on the pic you provided, the typical solution would be to have 2 separate panels, each with their own TitledBorder, and then place both of these panels on a third outer panel.
However, you could create a similar effect on a single panel by replacing the TitledBorders with a combination of a JLabel followed by a JSeparator.
The difference is that the logical "group" of fields is now only defined by title that isn't surrounding the whole group. Some people prefer this, others do not.
Here's a sample of your pic to give you the idea:
import java.awt.*;
import javax.swing.*;
public class Test implements Runnable
{
private JTextField firstName;
private JTextField lastName;
private JTextField title;
private JTextField nickname;
private JComboBox format;
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Test());
}
public Test()
{
firstName = new JTextField(20);
lastName = new JTextField(20);
title = new JTextField(20);
nickname = new JTextField(20);
format = new JComboBox();
}
public void run()
{
JFrame frame = new JFrame();
frame.getContentPane().add(createPanel());
frame.pack();
frame.setVisible(true);
}
private JPanel createPanel()
{
JPanel p = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(4,4,4,4);
gbc.ipadx = 1;
gbc.ipady = 1;
gbc.anchor = GridBagConstraints.WEST;
JLabel nameHeader = new JLabel("Name:");
nameHeader.setForeground(Color.RED.darker());
p.add(nameHeader, gbc);
gbc.gridx = 1;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
p.add(new JSeparator(JSeparator.HORIZONTAL), gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.fill = GridBagConstraints.NONE;
p.add(new JLabel("First Name"), gbc);
gbc.gridx = 1;
p.add(firstName, gbc);
gbc.gridx = 2;
p.add(new JLabel("Last Name"), gbc);
gbc.gridx = 3;
p.add(lastName, gbc);
gbc.gridx = 0;
gbc.gridy = 2;
p.add(new JLabel("Title"), gbc);
gbc.gridx = 1;
p.add(title, gbc);
gbc.gridx = 2;
p.add(new JLabel("Nickname"), gbc);
gbc.gridx = 3;
p.add(nickname, gbc);
gbc.gridx = 0;
gbc.gridy = 3;
p.add(new JLabel("Format"), gbc);
gbc.gridx = 1;
gbc.gridwidth = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
p.add(format, gbc);
return p;
}
}
You could play with the constraints to polish this up a bit, but you get the idea.
An upside to this approach is that when adding more fields for the Email section, you can get them to line up with the fields in the Name section. With separate panels, this would be more difficult (you could use a bunch of Box.createHorizontalStrut(...) for this).
The downside to this approach is that you now have a large panel with many fields, and it could get a bit unwieldy to maintain if you need to add more fields.
Try This :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
class SwingLayoutDemo {
private JFrame mainFrame;
private JLabel headerLabel;
private JLabel statusLabel;
private JPanel controlPanel;
private JLabel msglabel;
public SwingLayoutDemo(){
prepareGUI();
}
public static void main(String[] args){
SwingLayoutDemo swingLayoutDemo = new SwingLayoutDemo();
swingLayoutDemo.showGridBagLayoutDemo();
}
private void prepareGUI(){
mainFrame = new JFrame("Java SWING Examples");
mainFrame.setSize(400,400);
mainFrame.setLayout(new GridLayout(3, 1));
headerLabel = new JLabel("",JLabel.CENTER );
statusLabel = new JLabel("",JLabel.CENTER);
statusLabel.setSize(350,100);
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent){
System.exit(0);
}
});
controlPanel = new JPanel();
controlPanel.setBorder(new TitledBorder (
new LineBorder (Color.black, 5),
"Title String"));
controlPanel.add(new JLabel("TitledBorder using LineBorder"));
controlPanel.setLayout(new FlowLayout());
mainFrame.add(headerLabel);
mainFrame.add(controlPanel);
mainFrame.add(statusLabel);
mainFrame.setVisible(true);
}
private void showGridBagLayoutDemo(){
headerLabel.setText("Layout in action: GridBagLayout");
JPanel panel = new JPanel();
panel.setBackground(Color.darkGray);
panel.setSize(300,300);
GridBagLayout layout = new GridBagLayout();
panel.setLayout(layout);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 0;
panel.add(new JButton("Button 1"),gbc);
gbc.gridx = 1;
gbc.gridy = 0;
panel.add(new JButton("Button 2"),gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.ipady = 20;
gbc.gridx = 0;
gbc.gridy = 1;
panel.add(new JButton("Button 3"),gbc);
gbc.gridx = 1;
gbc.gridy = 1;
panel.add(new JButton("Button 4"),gbc);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = 2;
panel.add(new JButton("Button 5"),gbc);
controlPanel.add(panel);
mainFrame.setVisible(true);
}
}

Java GridBagLayout : make component align to left

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

Categories

Resources