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

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

好的,到现在为止,它都可以正常工作。现在,当1显示两个elasticPanel时,用户再次选择JComboBox。我现在需要发生的是elasticPanel应该显示一个具有正常大小的JComboBox。但是由于elasticPanel已经展开,所以发生的事情是它显示JComboBox被拉伸以适合其大小。因此它看起来很奇怪。



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

在选择之前。选择了NONE



选择一个元素



再次选择NONE



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

我已经尝试过setSize()方法。它什么也没做。.那么如何解决此问题?

任何帮助表示赞赏。谢谢!

最佳答案

很难说您是在指CardLayout是什么。由于CardLayout的工作方式不同。您可以做的就是简单地将一个JPanel说具有GridLayout(0, 1)的basePanel放置在另一个JPanel说contentPanel的顶部,然后将其设置为JPanel和调用包的内容窗格( ),当您从视图中添加或删除元素时。这是一个示例,向您展示我的意思。

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.*;
import java.awt.event.*;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.*;

public class VirtualViewGUI extends JFrame
{
    private JPanel rightPanel;
    private ElasticPanel elasticPanel;

    public VirtualViewGUI()
    {
        super("Virtual View");

        JMenuBar jmenuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenu helpMenu = new JMenu("Help");
        JMenu feel = new JMenu("Look & Feel");

        JMenu layOutMenu = new JMenu("ConfigureCells");
        JMenuItem add_files = new JMenuItem("Select Directory..");
        JMenuItem minCellSize = new JMenuItem("height 260 X  width 260");
        JMenuItem moderateCellSize = new JMenuItem("height 320 X  width 320");
        JMenuItem maxCellSize = new JMenuItem("height 360 X  width 360");
        JMenuItem exit = new JMenuItem("Exit");
        JMenuItem help = new JMenuItem("Help Content");

        fileMenu.add(add_files);
        fileMenu.add(exit);
        layOutMenu.add(minCellSize);
        layOutMenu.add(moderateCellSize);
        layOutMenu.add(maxCellSize);
        helpMenu.add(help);

        jmenuBar.add(fileMenu);
        jmenuBar.add(layOutMenu);
        jmenuBar.add(helpMenu);

        ImageIcon myImage = null;
        try
        {
            myImage = new ImageIcon(
                new URL("http://gagandeepbali.uk.to/" +
                        "gaganisonline/images/swing/" +
                        "stackoverflow/cow-cartoon.jpg"));
        }
        catch(MalformedURLException mue)
        {
            mue.printStackTrace();
        }

        JLabel icon = new JLabel(myImage);
        icon.setIcon(myImage);
        setJMenuBar(jmenuBar);

        rightPanel = new JPanel();
        elasticPanel = new ElasticPanel(this);
        rightPanel.add(elasticPanel);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));
        contentPane.add(icon, BorderLayout.CENTER);
        contentPane.add(rightPanel, BorderLayout.LINE_END);

        setContentPane(contentPane);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);
        setVisible(true);
        System.out.println("File Separator is : " + System.getProperty("file.separator"));
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new VirtualViewGUI();
            }
        });
    }
}

class ElasticPanel extends JPanel
{
    private JFrame frame;
    private JPanel contentPane;
    /*
     * 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];
                    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];
                add(prodCombo[counter - 1]);
                System.out.println("Item Added\nCounter : " + counter);
            }

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

    public ElasticPanel(JFrame frame)
    {
        this.frame = frame;
        prodCombo = new JComboBox[1];
        counter = 1;

        setLayout(new GridLayout(0, 1, 5, 5));

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

        add(prodCombo[counter - 1]);
    }
}

10-08 18:09