1

我想在另一个按钮的正下方单击动态添加 jlabel。我无法弄清楚要用于添加 jlabel 的布局。任何提示或解决方案将不胜感激

代码在这里

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

            }
        });

    }
}

在这里,我使用了框布局,但字段出现在全屏上。作为 在此处输入图像描述


我应该如何在 boxlayout 中自定义调整组件的大小?

4

1 回答 1

2

您可以为此目的使用GridBagLayoutfill ,并将其属性指定为任一HORIZONTAL or NONE,如果您不希望JLabels 分别调整VERTICALLY or BOTH方式的大小。一个最简单的例子来帮助你:

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);
    }
}
于 2013-08-31T15:49:18.793 回答