[英]Why the show method of card layout doesn't work in this case?
我正在嘗試使用JComboBox
和CardLayout
在不同的面板之間切換,但不會發生任何切換。 打印ItemSelected
表明ItemListener
工作正常,並且卡片布局的准確性通過檢查其他方法(如next()
、 previous()
、...
如果有人可以幫助我解決這個問題,我將不勝感激。
public class MyPanel exends JPanel {
public MyPanel() {
setBodyPanel();
}
private void setBodyPanel() {
card = new JPanel(new CardLayout());
cards.add(noBodyPanel);
cards.add(formPanel);
cards.add(jsonPanel);
cards.add(binaryFilePanel);
String comboBoxItems[] = {"No Body", "Form Data", "JSON", "Binary Data"};
JComboBox cbBodyType = new JComboBox(comboBoxItems);
cbBodyType.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
CardLayout cl = (CardLayout) cards.getLayout();
if (e.getStateChange() == ItemEvent.SELECTED) {
cl.show(cards,e.getItem().toString());
System.out.println(e.getItem().toString());
}
}
});
JPanel cbPanel = new JPanel();
cbPanel.add(cbBodyType);
add(cbPanel,BorderLayout.SOUTH);
add(cards,BorderLayout.CENTER);
}}
我刪除了不必要的代碼
您需要添加具有相同名稱的JPanel
來檢索它。
這是一個mre 1演示它:
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.event.ItemEvent;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Main {
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.add(new MyPanel());
frame.pack();
frame.setVisible(true);
}
}
class MyPanel extends JPanel {
public MyPanel() {
setLayout(new BorderLayout(10,10));
setBodyPanel();
}
private void setBodyPanel() {
String comboBoxItems[] = {"No Body", "Form Data", "JSON", "Binary Data"};
JPanel cards = new JPanel(new CardLayout());
for(String name : comboBoxItems){
cards.add(name, getPanel(name));
}
JComboBox<String> cbBodyType = new JComboBox<>(comboBoxItems);
cbBodyType.addItemListener(e -> {
CardLayout cl = (CardLayout) cards.getLayout();
if (e.getStateChange() == ItemEvent.SELECTED) {
cl.show(cards,(String)e.getItem());
}
});
add(cards,BorderLayout.CENTER);
JPanel cbPanel = new JPanel();
cbPanel.add(cbBodyType);
add(cbPanel,BorderLayout.PAGE_END);
}
private Component getPanel(String name) {
JPanel p = new JPanel();
p.add(new JLabel(name +" panel"));
return p;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.