human
human

Reputation: 647

how to add jlabel one below the other on jbutton click

I wanted to add jlabel dynamically on button click right below the other. I am not able to figure out the layout to be used in order to add jlabel. Any hint or solution will be appreciated

Code goes here

    package com.vastu;

import javax.swing.JPanel;

public class spanel extends JPanel {

    String[] nakshatras = {"SELECT","Ashwini","Bharani","Kritika","Rohini","Mrugashira","Aardra","Punarvasu","Pushya","Aashlesha","Magha","Poorva","Phalguni","Uttara","Phalguni","Hasta","Chitra","Swati","Vishakha","Anuradha","Jyeshta","Moola","Poorvashada","Uttarashada","Shravana","Dhanishta","Shatabhisha","Poorvabhadra","Uttarabhadra","Revati"};
    String[] more={"MORE MEMBERS","FATHER","MOTHER","HUSBAND","WIFE","SON","DAUGHTER"};
    public spanel() {
        setBackground(new Color(147, 112, 219));
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        JLabel lblTarabala = new JLabel("tarabala:");
        add(lblTarabala);

        JLabel lblStarOfOwner = new JLabel("STAR OF OWNER  :");
        add(lblStarOfOwner);

        JComboBox comboBox = new JComboBox(nakshatras);
        add(comboBox);

        JComboBox comboBox_1 = new JComboBox(more);
        add(comboBox_1);

        comboBox_1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                JComboBox jc = (JComboBox) e.getSource();
                Integer i=jc.getSelectedIndex();
                if(i==0){
                    repaint();
                }else if(i==1){
                    JLabel newmember=new JLabel();
                    JComboBox star_f=new JComboBox(nakshatras);
                    GridBagConstraints gbc_starf = new GridBagConstraints();
                    star_f.setBackground(new Color(211, 211, 211));
                    newmember.setFont(new Font("Times New Roman", Font.BOLD, 14));
                    newmember.setText("STAR OF FATHER  :");
                    newmember.setBackground(new Color(147, 112, 219));
                    gbc_starf.gridwidth=5;
                    add(newmember);
                    add(star_f);
                    revalidate();
                }else if(i==2){
                    JLabel newmember=new JLabel();
                    JComboBox star_m=new JComboBox(nakshatras);
                    GridBagConstraints gbc_starm = new GridBagConstraints();
                    star_m.setBackground(new Color(211, 211, 211));
                    newmember.setFont(new Font("Times New Roman", Font.BOLD, 14));
                    newmember.setText("STAR OF MOTHER  :");
                    newmember.setBackground(new Color(147, 112, 219));
                    gbc_starm.gridwidth=5;
                    add(newmember);
                    add(star_m);
                    revalidate();
                }else if(i==3){
                    JLabel newmember=new JLabel();
                    JComboBox star_h=new JComboBox(nakshatras);
                    GridBagConstraints gbc_starh = new GridBagConstraints();
                    star_h.setBackground(new Color(211, 211, 211));
                    newmember.setFont(new Font("Times New Roman", Font.BOLD, 14));
                    newmember.setText("STAR OF HUSBAND  :");
                    newmember.setBackground(new Color(147, 112, 219));
                    gbc_starh.gridwidth=5;
                    add(newmember);
                    add(star_h);
                    revalidate();
                }

            }
        });

    }
}

here i used box layout but the fields appear on full screen. as enter image description here


How am i supposed to custom resize component in boxlayout?

Upvotes: 1

Views: 2456

Answers (1)

nIcE cOw
nIcE cOw

Reputation: 24626

You can use GridBagLayout for this purpose, and specify it's fill property to either HORIZONTAL or NONE, if you do not want the JLabels to resize VERTICALLY or BOTH ways respectively. One simplest example for your help :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DynamicComponentAddition {

    private JFrame frame;
    private JPanel compPanel;
    private JLabel label;
    private JButton button; 

    private GridBagConstraints gbc;

    private int counter;

    public DynamicComponentAddition() {
        gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.gridx = 0;
        counter = 0;
    }

    private void displayGUI() {
        frame = new JFrame("Dynamic component addition");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel(new BorderLayout(5, 5));

        compPanel = new JPanel(new GridBagLayout());
        button = new JButton("Add Component");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                final JLabel label = new JLabel(
                        Integer.toString(counter), JLabel.CENTER);
                addComp(compPanel, label, counter++);
            }
        });

        contentPane.add(compPanel, BorderLayout.CENTER);
        contentPane.add(button, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private void addComp(JPanel panel, JComponent comp, int gridy) {
        gbc.gridy = gridy;      
        panel.add(comp, gbc);
        frame.pack();
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new DynamicComponentAddition().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

Upvotes: 2

Related Questions