簡體   English   中英

為什么卡片布局的 show 方法在這種情況下不起作用?

[英]Why the show method of card layout doesn't work in this case?

我正在嘗試使用JComboBoxCardLayout在不同的面板之間切換,但不會發生任何切換。 打印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;
    }
}


1強烈建議在提問和回答時發布mre或SSCCE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM