Reputation: 317
I'm attempting to re-create the following, extremely basic GUI seen here:
My output is as follows:
I'm having a difficult time formatting the JButtons. For one thing, no matter what I do I cannot get the second Panel, the 'shapePane' to display below the first Panel the 'colorPane' secondly, I am unable to correctly make the y axis of the buttons larger to give them a fatter appearance. Further, the top panel the 'shapePane' seems to dynamically move as the window is resized whereas, the second 'colorPane' stays in a fixed position regardless of the window resizing.
If someone could please provide a bit of assistance I would be immensely grateful
my code thus far is as follows:
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
public class GUI extends JFrame implements ActionListener, WindowListener
{
private JButton circleButton;
private JButton rectangleButton;
private JButton redButton;
private JButton greenButton;
private JButton blueButton;
private JButton exitButton;
private JTextField textField1;
private JLabel label1;
private JPanel contentPane;
private JPanel colorPane;
private JPanel shapePane;
private JFrame contentFrame;
private int count;
public GUI (String title)
{
super(title);
//setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//setBounds(100, 100, 945, 580);
//contentFrame = new JFrame();
//contentPane = new JPanel();
//contentFrame.add(contentPane);
//contentPane.setBorder(new LineBorder(new Color(50, 5, 232), 4, true));
//setContentPane(contentPane);
//contentPane.setLayout(null);
colorPane = new JPanel();
//colorPane.setBorder(new LineBorder(new Color(34, 174, 82), 1, true));
colorPane.setBounds(10, 32, 515, 125);
//contentPane.add(colorPane);
//colorPane.setLayout(null);
shapePane = new JPanel();
shapePane.setBounds(10, 165, 515, 315);
//shapePane.setBorder(new LineBorder(new Color(34, 174, 82), 1, true));
//contentPane.add(shapePane);
//shapePane.setLayout(null);
circleButton = new JButton("Circle");
circleButton.setHorizontalAlignment(SwingConstants.LEFT);
rectangleButton = new JButton("Rectangle");
rectangleButton.setHorizontalAlignment(SwingConstants.LEFT);
greenButton = new JButton("Green");
redButton = new JButton("Red");
blueButton = new JButton("Blue");
exitButton = new JButton("Exit");
textField1 = new JTextField(20);
label1 = new JLabel("current time here");
colorPane.add(redButton, BorderLayout.CENTER);
colorPane.add(greenButton, BorderLayout.CENTER);
colorPane.add(blueButton, BorderLayout.CENTER);
shapePane.add(rectangleButton, BorderLayout.SOUTH);
shapePane.add(circleButton, BorderLayout.SOUTH);
shapePane.add(exitButton, BorderLayout.SOUTH);
getContentPane().add(textField1, BorderLayout.EAST);
getContentPane().add(label1, BorderLayout.WEST);
getContentPane().add(colorPane, BorderLayout.CENTER);
//contentFrame.add(colorPane);
getContentPane().add(shapePane, BorderLayout.CENTER);
//contentFrame.add(shapePane);
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
Upvotes: 1
Views: 421
Reputation: 18792
The following should get you started:
Set label's vertical and horizontal position so it appears in the bottom left
and and its desired width. For more layout flexibility consider warping it in a JPanel
:
label1 = new JLabel("current time here");
label1.setVerticalAlignment(SwingConstants.BOTTOM);
label1.setHorizontalAlignment(SwingConstants.LEFT);
label1.setPreferredSize(new Dimension(200, 0)); //height is set by the layout manger
getContentPane().add(label1, BorderLayout.WEST);
Use a GridLayout for the buttons pane:
colorPane = new JPanel();
colorPane.setLayout(new GridLayout(2, 3));
Initialize buttons and add them one by one to the grid pane:
redButton = makeButton("Red");
colorPane.add(redButton);
Where makeButton
is a method implemented to avoid duplicating code:
private JButton makeButton(String text) {
JButton b = new JButton(text);
b.setHorizontalAlignment(SwingConstants.LEFT);
b.addActionListener(this);
b.setPreferredSize(new Dimension(125, 55)); //set preferred and let Layout manager do its work
return b;
}
Set the text area number of columns. Its height is set by the layout manger:
textArea = new JTextArea(0,20);
getContentPane().add(textArea, BorderLayout.EAST);
Putting it all together:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
public class GUI extends JFrame implements ActionListener
{
private final JButton circleButton, rectangleButton, redButton;
private final JButton greenButton, blueButton, exitButton;
private final JTextArea textArea;
private final JLabel label1;
private final JPanel colorPane;
private static final int ROWS = 2, COLS = 3;
public GUI (String title)
{
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//set label's vertical and horizontal position so it appears in the bottom left
//and and its desired width
//for more layout flexibility consider warping it in a JFrame
label1 = new JLabel("current time here");
label1.setVerticalAlignment(SwingConstants.BOTTOM);
label1.setHorizontalAlignment(SwingConstants.LEFT);
label1.setPreferredSize(new Dimension(200, 0)); //height is set by the layout manger
getContentPane().add(label1, BorderLayout.WEST);
//use a GridLayout for the buttons pane
colorPane = new JPanel();
colorPane.setLayout(new GridLayout(ROWS, COLS));
getContentPane().add(colorPane, BorderLayout.CENTER);//each BorderLayout position can hold ONE component
redButton = makeButton("Red");
colorPane.add(redButton);
greenButton = makeButton("Green");
colorPane.add(greenButton);
blueButton = makeButton("Blue");
colorPane.add(blueButton);
rectangleButton = makeButton("Rectangle");
colorPane.add(rectangleButton);
circleButton = makeButton("Circle");
colorPane.add(circleButton);
exitButton = makeButton("Exit");
colorPane.add(exitButton);
//set the text area number of columns. Its height is set by the layout manger
textArea = new JTextArea(0,20);
getContentPane().add(textArea, BorderLayout.EAST);
pack();
}
private JButton makeButton(String text) {
JButton b = new JButton(text);
b.setHorizontalAlignment(SwingConstants.LEFT);
b.addActionListener(this);
b.setPreferredSize(new Dimension(125, 55)); //set preferred and let Layout manager do its work
return b;
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(((JButton)e.getSource()).getText()+ " button pressed");
}
public static void main(String[] args) {
new GUI("My Gui").setVisible(true);
}
}
Map
:
public class GUI extends JFrame implements ActionListener
{
private Map <String, JButton> buttons; // a map to hold references to all buttons
private final JTextArea textArea;
private final JLabel label1;
private final JPanel colorPane;
private static final int ROWS = 2, COLS = 3;
private static final String[] BUTTON_LABELS = {"Red","Green", "Blue", "Rectangle", "Circle", "Exit"};
public GUI (String title)
{
super(title);
buttons = new HashMap<>();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//set label's vertical and horizontal position so it appears in the bottom left
//and and its desired width
//for more layout flexibility consider warping it in a JFrame
label1 = new JLabel("current time here");
label1.setVerticalAlignment(SwingConstants.BOTTOM);
label1.setHorizontalAlignment(SwingConstants.LEFT);
label1.setPreferredSize(new Dimension(200, 0)); //height is set by the layout manger
getContentPane().add(label1, BorderLayout.WEST);
//use a GridLayout for the buttons pane
colorPane = new JPanel();
colorPane.setLayout(new GridLayout(ROWS, COLS));
getContentPane().add(colorPane, BorderLayout.CENTER);//each BorderLayout position can hold ONE component
for(String text : BUTTON_LABELS){
JButton button = makeButton(text);
colorPane.add(button);
buttons.put(text, button);
}
//set the text area number of columns. Its height is set by the layout manger
textArea = new JTextArea(0,20);
getContentPane().add(textArea, BorderLayout.EAST);
pack();
}
private JButton makeButton(String text) {
JButton b = new JButton(text);
b.setHorizontalAlignment(SwingConstants.LEFT);
b.addActionListener(this);
b.setPreferredSize(new Dimension(125, 55)); //set preferred and let Layout manager do its work
return b;
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(((JButton)e.getSource()).getText()+ " button pressed");
}
public static void main(String[] args) {
new GUI("My Gui").setVisible(true);
}
}
Upvotes: 1