javagrouplayout

GroupLayout not aligning properly


I have been trying to make a program that allows the user to create squares and circles of a color that they can set using JSliders. I am trying to use GroupLayout to set this up, but it is not working the way that it seems it should.

I want the circle, square, and color buttons to appear next to each other, but for the JSliders and their name JLabels to appear horizontally alligned with the Color JButton (going down from it).

However, they appear as if just using flowlayout, going from right to left and carrying down to a new row if they do not fit.

Image of components being placed side to side

import java.util.ArrayList;
import java.text.*;
import javax.swing.*;
import javax.swing.GroupLayout;
import java.awt.event.*;
import java.awt.*;
import javax.swing.event.*;

public class SMYS01 extends JFrame{

    private JLabel redL=new JLabel("red"), greenL=new JLabel("green"), blueL=new JLabel("blue"), alphaL=new JLabel("alpha");
    private JButton openColorSliders=new JButton("Change colors");
    private JSlider red=new JSlider(JSlider.HORIZONTAL, 0,255,130);
    private JSlider green=new JSlider(JSlider.HORIZONTAL, 0,255,130);
    private JSlider blue=new JSlider(JSlider.HORIZONTAL, 0,255,130);
    private JSlider alpha=new JSlider(JSlider.HORIZONTAL, 0,255,255);
    private int redColor=130, blueColor=130, greenColor=130, alphaColor=255;    

    public static void main(String[] args) {
        SMYS01 window = new SMYS01();    
    }


    private JButton makeSquareB = new JButton("New Square" /*, add icon later*/);

    private JButton makeCircleB = new JButton("New Circle");

    private Color background = new Color(0, 150, 0);



    public SMYS01(){
        //Anonymous actionlisteners and changelisteners for each button and slider. 
        //not essential for layout problems so leaving them out
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane();
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        MyPanel thing = new MyPanel();

        setContentPane(thing);

        setSize(thing.getPreferredSize());

        setTitle("Art!");
    }


    private class MyPanel extends JPanel {

        public MyPanel() {
            //MouseMotionListener and MouseListener not related
            GroupLayout layout = new GroupLayout(this);
            red.setMajorTickSpacing(50);
            red.setMinorTickSpacing(5);
            red.setPaintTicks(true);
            red.setPaintLabels(true);
            blue.setMajorTickSpacing(50);
            blue.setMinorTickSpacing(5);
            blue.setPaintTicks(true);
            blue.setPaintLabels(true);
            green.setMajorTickSpacing(50);
            green.setMinorTickSpacing(5);
            green.setPaintTicks(true);
            green.setPaintLabels(true);
            alpha.setMajorTickSpacing(50);
            alpha.setMinorTickSpacing(5);
            alpha.setPaintTicks(true);
            alpha.setPaintLabels(true);
            layout.setAutoCreateGaps(true);
            layout.setAutoCreateContainerGaps(true);

            GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
            hGroup.addComponent(makeCircleB);
            hGroup.addComponent(makeSquareB);
            hGroup.addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
                    .addComponent(openColorSliders)
                    .addComponent(redL)
                    .addComponent(red)
                    .addComponent(greenL)
                    .addComponent(green)
                    .addComponent(blueL)
                    .addComponent(blue)
                    .addComponent(alphaL)
                    .addComponent(alpha));

            GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
            vGroup
                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                    .addComponent(makeCircleB)
                    .addComponent(makeSquareB)
                    .addComponent(openColorSliders));
            vGroup
                    .addComponent(redL)
                    .addComponent(red)
                    .addComponent(greenL)
                    .addComponent(green)
                    .addComponent(blueL)
                    .addComponent(blue)
                    .addComponent(alphaL)
                    .addComponent(alpha);
            layout.setHorizontalGroup(hGroup);
            layout.setVerticalGroup(vGroup);





        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(700, 500);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(background);
            g.drawRect((int)g.getClipBounds().getX(),(int)g.getClipBounds().getY(),(int)g.getClipBounds().getWidth(),(int)g.getClipBounds().getHeight());
            g.fillRect((int)g.getClipBounds().getX(),(int)g.getClipBounds().getY(),(int)g.getClipBounds().getWidth(),(int)g.getClipBounds().getHeight());


            //An iterated loop drawing the shapes using info from square and circle classes
            //Both of which implement a shape interface. Not part of problem
        }

I have looked around, and not really seen any reason as to why this is happening. After a lot of digging and thought, I still have no idea why this is working. I checked my parenthesis probably 20 times, and I have separated it out into more statements to guarantee that they are not the problem, but it is still happening.

Any help is greatly appreciated!





Solution

  • Well, you missed a single line of code

    Add this

    setLayout(layout);
    

    Just after this

    layout.setHorizontalGroup(hGroup);
    layout.setVerticalGroup(vGroup);