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