Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何合同卡布局_Java_Swing_Jframe_Jpanel_Cardlayout - Fatal编程技术网

Java 如何合同卡布局

Java 如何合同卡布局,java,swing,jframe,jpanel,cardlayout,Java,Swing,Jframe,Jpanel,Cardlayout,我有一个带有VerticalLayout(org.jdesktop.swingx.VerticalLayout)的主面板。主面板有几个子面板。其中之一是根据用户选择动态更改面板。因此,我将它的布局设置为CardLayout,我认为这是实现这一点最简单(也许是最好的?)的方法 我将把那个面板称为弹性面板。顾名思义,它应该是有弹性的。也就是说,它应该能够扩张和收缩。假设它的行为是这样的。如果用户选择1,则elasticPanel应显示一个,例如,JComboBox。如果用户选择2,则两个JCombo

我有一个带有VerticalLayout
(org.jdesktop.swingx.VerticalLayout)的主面板。主面板有几个子面板。其中之一是根据用户选择动态更改面板。因此,我将它的布局设置为
CardLayout
,我认为这是实现这一点最简单(也许是最好的?)的方法

我将把那个面板称为弹性面板。顾名思义,它应该是有弹性的。也就是说,它应该能够扩张和收缩。假设它的行为是这样的。如果用户选择
1
,则elasticPanel应显示一个,例如,
JComboBox
。如果用户选择
2
,则两个
JComboBox
s

好的,到目前为止它工作得很好。现在,当
elasticPanel
显示两个
JComboBox
s时,用户再次选择
1
。我现在需要做的是
elasticPanel
应该显示一个
JComboBox
的正常大小。但是由于
elasticPanel
已经展开,它会显示
JComboBox
拉伸以适应其大小。所以它看起来很奇怪


下面的屏幕截图显示了我的界面存在的问题

在选择之前<已选择代码>无

选择了一个元素

NONE
再次被选中

我需要最后一个屏幕截图中的
elasticPanel
(故障位置)与第一个屏幕截图中的相同。这只是一个简单的例子。想象一下在显示大约5、6个子组件后返回到
NONE
时的外观

我已经尝试了
setSize()
方法。它不起任何作用。那么如何解决这个问题呢


感谢您的帮助。谢谢

如果我理解正确,您有两个不同的面板,您可以使用
卡片布局在这两个面板之间切换。
CardLayout
的问题在于它采用了最大面板的大小


因此,使用
CardLayout
您将无法缩小容器的大小,但您可以通过使用
BorderLayout
将面板包装在另一个面板中,并将面板放入
BorderLayout.NORTH
来避免组合框被拉伸,如果我理解正确的话,您有两个不同的面板,可以使用
卡片布局
在这两个面板之间切换。
CardLayout
的问题在于它采用了最大面板的大小


因此,使用
CardLayout
您将无法缩小容器的大小,但您可以通过使用
BorderLayout
将面板包装到另一个面板中来避免组合框被拉伸,并将面板置于
边框布局。NORTH

很难说您指的是什么东西。因为它以不同的方式工作。您只需将一个
JPanel
saybasePanel放置在
GridLayout(0,1)
上,然后将此
JPanel
放置在另一个
JPanel
saycontentPanel上,现在将其设置为
JFrame
和calling pack()的内容窗格在视图中添加或删除图元时。这里有一个例子告诉你我的意思

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

public class ElasticPanel
{
    private JFrame frame;
    private JPanel contentPane;
    private JPanel basePanel;
    /*
     * Array to hold the JComboBox
     * elements.
     */
    private JComboBox[] prodCombo;  
    private JComboBox[] temp;
    /* 
     * Counter to keep track
     * of the number of JComboBox 
     * present.
     */
    private int counter;  
    /*
     * Data for each JComboBox
     */
    private String[] data = {
                                "None",
                                "Sub Category"
                            };

    private ActionListener comboAction =
            new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent ae)
        {
            JComboBox cbox = (JComboBox) ae.getSource();
            String command = (String) ae.getActionCommand();
            int index = Integer.parseInt(command);
            String selection = (String) cbox.getSelectedItem();

            if (selection.equals("None"))
            {
                /*
                 * i = index + 1, because, we want to
                 * remove all JComboBox after this one.
                 */
                for (int i = (index + 1); i < prodCombo.length; i++)
                {
                    temp = new JComboBox[prodCombo.length];
                    for (int j = 0; j < prodCombo.length; j++)
                        temp[j] = prodCombo[j];
                    basePanel.remove(prodCombo[i]); 
                }
                prodCombo = new JComboBox[index + 1];
                for (int i = 0; i <= index; i++)
                {                   
                    prodCombo[i] = temp[i];
                }
                counter = prodCombo.length;
                System.out.println("Item Removed\nCounter : " + counter);
            }
            else if (selection.equals("Sub Category"))
            {
                counter++;
                temp = new JComboBox[counter];
                for (int i = 0; i < prodCombo.length; i++)
                {
                    temp[i] = prodCombo[i];
                }
                temp[counter - 1] = new JComboBox(data);
                temp[counter - 1].setActionCommand("" + (counter - 1));
                temp[counter - 1].addActionListener(this);
                prodCombo = new JComboBox[counter];
                for (int i = 0; i < counter; i++)
                    prodCombo[i] = temp[i];
                basePanel.add(prodCombo[counter - 1]);  
                System.out.println("Item Added\nCounter : " + counter);
            }

            //basePanel.revalidate();
            //basePanel.repaint();
            frame.pack();
        }
    };

    public ElasticPanel()
    {
        prodCombo = new JComboBox[1];
        counter = 1;
    }

    private void displayGUI()
    {
        frame = new JFrame("Elastic Panel Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        contentPane = new JPanel();

        basePanel = new JPanel(new GridLayout(0, 1, 5, 5));

        prodCombo[counter - 1] = new JComboBox(data);
        prodCombo[counter - 1].setActionCommand("" + (counter - 1));
        prodCombo[counter - 1].addActionListener(comboAction);

        basePanel.add(prodCombo[counter - 1]);
        contentPane.add(basePanel);

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

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new ElasticPanel().displayGUI();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公营弹力板
{
私有JFrame;
私有JPanel内容窗格;
专用JPanel基板;
/*
*数组来保存JComboBox
*元素。
*/
私有JComboBox[]prodCombo;
私人JComboBox[]临时;
/* 
*计数器跟踪
*JComboBox的数量
*现在。
*/
专用int计数器;
/*
*每个JComboBox的数据
*/
私有字符串[]数据={
“没有”,
“子类别”
};
私有操作侦听器组合操作=
新建ActionListener()
{
@凌驾
已执行的公共无效行动(行动事件ae)
{
JComboBox cbox=(JComboBox)ae.getSource();
String命令=(String)ae.getActionCommand();
int index=Integer.parseInt(命令);
字符串选择=(字符串)cbox.getSelectedItem();
if(selection.equals(“无”))
{
/*
*i=index+1,因为我们想要
*移除此JComboBox之后的所有JComboBox。
*/
for(inti=(索引+1);i对于(int i=0;i很难说您指的是什么内容。因为它以不同的方式工作。您只需放置一个
JPanel
saybasePanel具有
GridLayout(0,1)
并将此
JPanel
放在另一个
JPanel
上,比如说contentPanel,现在将其设置为
JFrame
的内容窗格,并在从视图中添加或删除元素时调用pack()。下面是一个示例,说明我的意思

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

public class ElasticPanel
{
    private JFrame frame;
    private JPanel contentPane;
    private JPanel basePanel;
    /*
     * Array to hold the JComboBox
     * elements.
     */
    private JComboBox[] prodCombo;  
    private JComboBox[] temp;
    /* 
     * Counter to keep track
     * of the number of JComboBox 
     * present.
     */
    private int counter;  
    /*
     * Data for each JComboBox
     */
    private String[] data = {
                                "None",
                                "Sub Category"
                            };

    private ActionListener comboAction =
            new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent ae)
        {
            JComboBox cbox = (JComboBox) ae.getSource();
            String command = (String) ae.getActionCommand();
            int index = Integer.parseInt(command);
            String selection = (String) cbox.getSelectedItem();

            if (selection.equals("None"))
            {
                /*
                 * i = index + 1, because, we want to
                 * remove all JComboBox after this one.
                 */
                for (int i = (index + 1); i < prodCombo.length; i++)
                {
                    temp = new JComboBox[prodCombo.length];
                    for (int j = 0; j < prodCombo.length; j++)
                        temp[j] = prodCombo[j];
                    basePanel.remove(prodCombo[i]); 
                }
                prodCombo = new JComboBox[index + 1];
                for (int i = 0; i <= index; i++)
                {                   
                    prodCombo[i] = temp[i];
                }
                counter = prodCombo.length;
                System.out.println("Item Removed\nCounter : " + counter);
            }
            else if (selection.equals("Sub Category"))
            {
                counter++;
                temp = new JComboBox[counter];
                for (int i = 0; i < prodCombo.length; i++)
                {
                    temp[i] = prodCombo[i];
                }
                temp[counter - 1] = new JComboBox(data);
                temp[counter - 1].setActionCommand("" + (counter - 1));
                temp[counter - 1].addActionListener(this);
                prodCombo = new JComboBox[counter];
                for (int i = 0; i < counter; i++)
                    prodCombo[i] = temp[i];
                basePanel.add(prodCombo[counter - 1]);  
                System.out.println("Item Added\nCounter : " + counter);
            }

            //basePanel.revalidate();
            //basePanel.repaint();
            frame.pack();
        }
    };

    public ElasticPanel()
    {
        prodCombo = new JComboBox[1];
        counter = 1;
    }

    private void displayGUI()
    {
        frame = new JFrame("Elastic Panel Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        contentPane = new JPanel();

        basePanel = new JPanel(new GridLayout(0, 1, 5, 5));

        prodCombo[counter - 1] = new JComboBox(data);
        prodCombo[counter - 1].setActionCommand("" + (counter - 1));
        prodCombo[counter - 1].addActionListener(comboAction);

        basePanel.add(prodCombo[counter - 1]);
        contentPane.add(basePanel);

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

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new ElasticPanel().displayGUI();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公营弹力板
{
私有JFrame;
私有JPanel内容窗格;
专用JPanel基板;
/*
*数组来保存JComboBox
*元素。
*/
私有JComboBox[]prodCombo;
私人JComboBox[]临时;
/* 
*计数器跟踪
*JComboBox的数量
*现在。
*/
普里夫