ListSelectionListener和CardLayout [英] ListSelectionListener and CardLayout

查看:554
本文介绍了ListSelectionListener和CardLayout的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要创建一个程序,从文件中读取数据,显示它具有JList和Jbutton中的GUI。我试图把它与CardLayout写那么可以当从JList中选择一个项目或单击一个JButton来显示相应的JPanel(即下一个,previous,第一和最后一个)。我能够从文件和显示数据到GUI成功地读取。我碰到2个问题,我已经试过在网上寻找答案,但似乎无法弄清楚:
1)如何获得JPanels使用CardLayout转?
当用户点击来自JList的一个项目将显示在文本字段的GUI 2)如何获得这些数据? JList的确实出​​现,我的ListSelectionListener工作,因为当我点击一个特定的项目,它将打印到控制台(作为测试)。

如果我注释掉所有JPanels中除1,那么它是正确显示,但是当我把所有的人,那么它不切换。

到目前为止,我有这对我ListSelectionListener(作为一个内部类):

 公共类CancerSelectionListener实现ListSelectionListener {    @覆盖
    公共无效的valueChanged(ListSelectionEvent E){
       整数选择=(整数)(((JList的)e.getSource())getSelectedIndex());
       如果(选择== 0){
           的System.out.println(嗒嗒); //作品
           //切换到CardLayout相应的JPanel
       }    }
}的String []测试仪;
    串睾丸;    ListModel的=新DefaultListModel();    的for(int i = 0; I< 36;我++){        测试仪= _controller.readCancer(ⅰ); //从文件中读取,这部分作品!
        睾丸=测试仪[0];        listModel.addElement(睾丸);    }    cancerList =新的JList(ListModel的);
    cancerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    cancerList.setSelectedIndex(-1);
    cancerList.setVisibleRowCount(5);    cancerListScroller =新JScrollPane的(cancerList);    CardLayout myCardLayout;
    myCardLayout =新CardLayout();
    mainPanel2.setLayout(myCardLayout);    myCardLayout.show(mainPanel2,测试);    CancerPanels.aplPanel APL =新CancerPanels.aplPanel();
    CancerPanels.fcPanels FC =新CancerPanels.fcPanels();
    CancerPanels.vhlsPanels vhls =新CancerPanels.vhlsPanels();
    CancerPanels.pdgPanels PDG =新CancerPanels.pdgPanels();
    CancerPanels.cebpaPanels CEBPA =新CancerPanels.cebpaPanels();
    mainPanel2.add(apl.aplReturn(),测试);
    mainPanel2.add(fc.fcReturn());
    mainPanel2.add(vhls.vhlsReturn());
    mainPanel2.add(pdg.pdgReturn());
    mainPanel2.add(cebpa.cebpaReturn());
    //我有37 JPanels被放置在使用CardLayout在JPanel,但我没有上传所有的人,因为它会占用大量的空间

每个JPanel中的数据从CancerPanels类静态内部类填充(只显示1,因为每个很长!)

 公共类CancerPanels扩展CancerGUI {静态的JPanel卡;
静态CancerController _cons =新CancerController();
静态的String [] cancerData;
静态JScrollPane的treatmentsScroller =新JScrollPane的(txtTreatments,JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED);
静态JScrollPane的causesScroller =新JScrollPane的(txtCauses,JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED);静态JScrollPane的symptomsScroller =新JScrollPane的(txtSymptoms,JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED);公共静态类aplPanel继承JPanel {    公众的JPanel aplReturn(){
        treatmentsScroller.setViewportView(txtTreatments);
        txtTreatments.setEditable(假);
        causesScroller.setViewportView(txtCauses);
        txtCauses.setEditable(假);
        symptomsScroller.setViewportView(txtSymptoms);
        txtSymptoms.setEditable(假);
        卡=新JPanel(新的GridLayout(6,1));
        cancerData = _cons.readCancer(0);
        resultName.setText(cancerData [0]);
        txtSymptoms.setText(cancerData [1]);
        txtCauses.setText(cancerData [2]);
        txtTreatments.setText(cancerData [3]);
        resultRate.setText(cancerData [4]);
        resultPrognosis.setText(cancerData [5]);
        cards.add(resultName);
        cards.add(symptomsScroller);
        cards.add(causesScroller);
        cards.add(treatmentsScroller);
        cards.add(resultRate);
        cards.add(resultPrognosis);
        返回卡;
    }
}

编辑:

下面是我最近一次尝试。我可以通过JList的滚动,但它不能正常显示正确的相应的JPanel(其实它并不显示任何内容,但每当我点击最后一个按钮,我不知道为什么那个按钮的作品)。我成功地设法放在一个JComboBox,一个ItemListener但最终,我希望CardLayout工作。我们的教练给我们提供样品code使用的,但是当我尝试吧,JPanels不切换(或者,如果他们做他们隐藏起来,不知道为什么)。

每个我的听众都在整体CancerGUI类公共内部类。

 公共Can​​cerGUI(){
    CancerPanels.aplPanel APL =新CancerPanels.aplPanel();
    CancerPanels.fcPanels FC =新CancerPanels.fcPanels();
    CancerPanels.vhlsPanels vhls =新CancerPanels.vhlsPanels();
    //超过30 JPanels我添加到使用CardLayout的JPanel的,所以我只贴3
    //他们每个人使用的网格布局mainPanel2 =新JPanel(新CardLayout());    mainPanel2.add(apl.aplReturn(),1);
    mainPanel2.add(fc.fcReturn(),2);
    mainPanel2.add(vhls.vhlsReturn(),3);CancerActionButtons _cab =新CancerActionButtons();   btnNext =的新的JButton(下一步);
    BTN previous =的新的JButton(previous);
    btnFirst =的新的JButton(第一);
    btnLast =的新的JButton(最后);
    btnClear =的新的JButton(清除);   btnNext.addActionListener(_cab);
   BTN previous.addActionListener(_cab);    btnFirst.addActionListener(_cab);
    btnLast.addActionListener(_cab);CancerItemListener _item =新CancerItemListener(); //这个监听器的工作原理!
    renalC.addItemListener(_item);
    skinC.addItemListener(_item);
    brainC.addItemListener(_item);
    bladderC.addItemListener(_item);
    ovarianC.addItemListener(_item);
    pancC.addItemListener(_item);
    breastC.addItemListener(_item);的String []测试仪;
    串睾丸;    ListModel的=新DefaultListModel();    的for(int i = 0; I< 36;我++){        测试仪= _controller.readCancer(ⅰ);
        睾丸=测试仪[0];        listModel.addElement(睾丸);    }    cancerList =新的JList(ListModel的);
    cancerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    cancerList.setSelectedIndex(-1);
    cancerList.setVisibleRowCount(5);
    cancerListScroller =新JScrollPane的(cancerList);
    ListSelection _list =新ListSelection();
    cancerList.addListSelectionListener(_list);    JScrollPane的treatmentsScroller =新JScrollPane的(txtTreatments,JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED);
    treatmentsScroller.setViewportView(txtTreatments);
    JScrollPane的causesScroller =新JScrollPane的(txtCauses,JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED);
    causesScroller.setViewportView(txtCauses);
    JScrollPane的symptomsScroller =新JScrollPane的(txtSymptoms,JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED);
    symptomsScroller.setViewportView(txtSymptoms);公共类ListSelection实现ListSelectionListener {    @覆盖
    公共无效的valueChanged(ListSelectionEvent E){
        串选择=(字符串)(((JList的)e.getSource())getSelectedValue());
        ((CardLayout)mainPanel2.getLayout())显示(mainPanel2,选择);
        ((CardLayout)mainPanel2.getLayout())显示(mainPanel2,选择);
    }}公共类CancerActionButtons实现的ActionListener {    @覆盖
    公共无效的actionPerformed(ActionEvent的五){
        开关(e.getActionCommand()){
            案第一:
                ((CardLayout)mainPanel2.getLayout())(第mainPanel2)。
            cancerCount = 1;
                打破;
            案最后:
                ((CardLayout)mainPanel2.getLayout()),最后(mainPanel2)。
            cancerCount = 11;
                打破;
            案previous:
                ((CardLayout)mainPanel2.getLayout())previous(mainPanel2)。
            cancerCount--;
            cancerCount = cancerCount< 1? 11:cancerCount;
                打破;
            案下一步:
                ((CardLayout)mainPanel2.getLayout())和Next(mainPanel2)。
            cancerCount ++;
            cancerCount = cancerCount> 11? 1:cancerCount; //
                打破;
        }
        cancerList.setSelectedIndex(cancerCount-1);
    }}/ **
 *内部类响应与一个JComboBox,任何用户交互
 *一般类型的癌症。
 * /公共类CancerItemListener实现的ItemListener {    @覆盖
    公共无效itemStateChanged(一个ItemEvent E){
        JPanel的showPanel =新JPanel();
        如果(e.getStateChange()== ItemEvent.SELECTED){
            串选择=(字符串)e.getItem();
            如果(selection.equalsIgnoreCase(皮肤癌)){
                CancerPanels.skin皮肤=新CancerPanels.skin();
                showPanel = skin.skinReturn();
            }否则如果(selection.equalsIgnoreCase(膀胱癌)){
                CancerPanels.bladder膀胱=新CancerPanels.bladder();
                showPanel = bladder.bladderReturn();
            }否则如果(selection.equalsIgnoreCase(胰腺癌)){
                CancerPanels.pancreatic胰腺=新CancerPanels.pancreatic();
                showPanel = pancreatic.returnPancreatic();
            }否则如果(selection.equalsIgnoreCase(肾癌)){
                CancerPanels.renal肾=新CancerPanels.renal();
                showPanel = renal.returnRenal();
            }否则如果(selection.equalsIgnoreCase(卵巢癌)){
                CancerPanels.ovarian卵巢=新CancerPanels.ovarian();
                showPanel = ovarian.ovarianReturn();
            }否则如果(selection.equalsIgnoreCase(乳腺癌)){
                CancerPanels.breast乳房=新CancerPanels.breast();
                showPanel = breast.returnBreast();
            }否则如果(selection.equalsIgnoreCase(脑癌)){
                CancerPanels.brain大脑=新CancerPanels.brain();
                showPanel = brain.returnBrain();
            }否则如果(selection.equalsIgnoreCase(希佩尔 - 林道综合征)){
                CancerPanels.vhlsPanels vhls =新CancerPanels.vhlsPanels();
                showPanel = vhls.vhlsReturn();
            }
            JOptionPane.showMessageDialog(NULL,showPanel);
        }
    }
}

其中JPanels被添加到CardLayout之前所做

独立的类:

 公共类CancerPanels扩展CancerGUI {静态字符串名称;
静态的JPanel卡;
静态CancerController _cons =新CancerController();
静态的String [] cancerData;
静态JScrollPane的treatmentsScroller =新JScrollPane的(txtTreatments,JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED);
静态JScrollPane的causesScroller =新JScrollPane的(txtCauses,JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED);静态JScrollPane的symptomsScroller =新JScrollPane的(txtSymptoms,JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED);公共静态类aplPanel继承JPanel {    公众的JPanel aplReturn(){
        treatmentsScroller.setViewportView(txtTreatments);
        txtTreatments.setEditable(假);
        causesScroller.setViewportView(txtCauses);
        txtCauses.setEditable(假);
        symptomsScroller.setViewportView(txtSymptoms);
        txtSymptoms.setEditable(假);
        卡=新JPanel(新的GridLayout(6,1));
        cancerData = _cons.readCancer(0);
        resultName.setText(cancerData [0]);
        txtSymptoms.setText(cancerData [1]);
        txtCauses.setText(cancerData [2]);
        txtTreatments.setText(cancerData [3]);
        resultRate.setText(cancerData [4]);
        resultPrognosis.setText(cancerData [5]);
        cards.add(resultName);
        cards.add(symptomsScroller);
        cards.add(causesScroller);
        cards.add(treatmentsScroller);
        cards.add(resultRate);
        cards.add(resultPrognosis);
        返回卡;
    }


解决方案

  • 在本质上你正在尝试做的是一个类的状态从另一个改变。

  • 这是怎么与Swing GUI的做的是,它是如何对非GUI程序做没有什么不同:一个类调用另一个类的公共方法

  • 一个关键是要有接线允许这种情况发生,这意味着一类需要提供给其他类,以便适当的方法可以适当引用被称为引用。正如他们所说,魔鬼在细节。

  • 1)如何获得JPanels使用CardLayout转? - 使持有类CardLayout可以例如有公共方法,的next() previous(),也许显示(SOME_STRING_CONSTANT)或一些其他 swapView(...)方法。

  • 2)我如何当用户点击来自JList的一个项目将显示在文本字段的GUI中的数据? - 这将涉及到利用听众的 - 类保持JTextField的将监听来自一个保存JList和通知时得到从列表显示类的必要信息类的通知。一个PropertyChangeListener可以很好地工作在这里。

例如,

 公共类CancerSelectionListener实现ListSelectionListener {
    私人CardDisplayingView cardDisplayingView = NULL;    公共Can​​cerSelectionListener(CardDisplayingView cardDisplayingView){
       this.cardDisplayingView = cardDisplayingView;
    }    @覆盖
    公共无效的valueChanged(ListSelectionEvent E){
       INT选择=((JList的)e.getSource())getSelectedIndex()。
       如果(选择== 0){
           如果(cardDisplayingView!= NULL){
             cardDisplayingView.swapView(...);
           }
       }    }
}

I'm creating a program that reads data from a file, displays it on a GUI that has a JList and JButtons. I am trying to write it with CardLayout so the appropriate JPanel can be displayed when an item is selected from the JList or a JButton is clicked (i.e. next, previous, first and last). I am able to successfully read from the file and display data to the GUI. I've run into 2 problems and I've tried searching online for answers but cant seem to figure it out: 1) How do I get the JPanels to switch using CardLayout? 2) How do I get the data to be displayed in the GUI in text fields when a user clicks an item from the JList? The JList does appear and my ListSelectionListener is working because when I click on a particular item, it will print to the console (as a test).

If I comment out all of the JPanels except for 1, then it is correctly displayed but when I place all of them, then it does not switch.

So far, I have this for my ListSelectionListener (as an inner class):

public class CancerSelectionListener implements ListSelectionListener {

    @Override
    public void valueChanged(ListSelectionEvent e) {
       Integer selection = (Integer)(((JList) e.getSource()).getSelectedIndex());
       if(selection == 0) {
           System.out.println("blah"); // works
           // switch to the corresponding JPanel in CardLayout 
       }

    }   
}

String[] tester;
    String teste;

    listModel = new DefaultListModel();

    for(int i = 0; i < 36; i++) {

        tester = _controller.readCancer(i); // reads from the file, this part works!
        teste = tester[0];

        listModel.addElement(teste);

    }

    cancerList = new JList(listModel);
    cancerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    cancerList.setSelectedIndex(-1);
    cancerList.setVisibleRowCount(5);

    cancerListScroller = new JScrollPane(cancerList);

    CardLayout myCardLayout;
    myCardLayout = new CardLayout();
    mainPanel2.setLayout(myCardLayout);

    myCardLayout.show(mainPanel2, "test");

    CancerPanels.aplPanel apl = new CancerPanels.aplPanel();
    CancerPanels.fcPanels fc = new CancerPanels.fcPanels();
    CancerPanels.vhlsPanels vhls = new CancerPanels.vhlsPanels();
    CancerPanels.pdgPanels pdg = new CancerPanels.pdgPanels();
    CancerPanels.cebpaPanels cebpa = new CancerPanels.cebpaPanels();


    mainPanel2.add(apl.aplReturn(), "test");
    mainPanel2.add(fc.fcReturn());
    mainPanel2.add(vhls.vhlsReturn());
    mainPanel2.add(pdg.pdgReturn());
    mainPanel2.add(cebpa.cebpaReturn()); 
    // I have 37 JPanels that are placed in the JPanel that uses CardLayout but I didn't post all    of them as it would take up lots of space

The data for each JPanel is populated from static inner classes in the CancerPanels class (only showing 1 as each is very long!)

public class CancerPanels extends CancerGUI {

static JPanel cards;
static CancerController _cons = new CancerController();
static String[] cancerData;
static JScrollPane treatmentsScroller = new JScrollPane(txtTreatments,   JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
static JScrollPane causesScroller = new JScrollPane(txtCauses, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

static JScrollPane symptomsScroller = new JScrollPane(txtSymptoms, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

public static class aplPanel extends JPanel {

    public JPanel aplReturn() {
        treatmentsScroller.setViewportView(txtTreatments);
        txtTreatments.setEditable(false);
        causesScroller.setViewportView(txtCauses);
        txtCauses.setEditable(false);
        symptomsScroller.setViewportView(txtSymptoms);
        txtSymptoms.setEditable(false);
        cards = new JPanel(new GridLayout(6,1));
        cancerData = _cons.readCancer(0);
        resultName.setText(cancerData[0]);
        txtSymptoms.setText(cancerData[1]);
        txtCauses.setText(cancerData[2]);
        txtTreatments.setText(cancerData[3]);
        resultRate.setText(cancerData[4]);
        resultPrognosis.setText(cancerData[5]);
        cards.add(resultName);
        cards.add(symptomsScroller);
        cards.add(causesScroller);
        cards.add(treatmentsScroller);
        cards.add(resultRate);
        cards.add(resultPrognosis); 
        return cards;
    }
}

Edit:

Here is my most recent attempt. I can scroll through the JList but it doesn't properly display the correct corresponding JPanel (in fact it doesn't display anything, except whenever I click the last button, I don't know why that button works). I successfully managed to place an ItemListener on a JComboBox but ultimately, I want the CardLayout to work. Our instructor provided us with sample code to use but when I try it, the JPanels do not switch (or if they do they're hidden, not sure why).

Each of my listeners are public inner classes in the overall CancerGUI class.

public CancerGUI() {
    CancerPanels.aplPanel apl = new CancerPanels.aplPanel();
    CancerPanels.fcPanels fc = new CancerPanels.fcPanels();
    CancerPanels.vhlsPanels vhls = new CancerPanels.vhlsPanels();
    // more than 30 JPanels that I add to the JPanel that uses CardLayout, so I only posted 3
    // each of them uses the GridLayout

mainPanel2 = new JPanel(new CardLayout());

    mainPanel2.add(apl.aplReturn(), "1");
    mainPanel2.add(fc.fcReturn(), "2");
    mainPanel2.add(vhls.vhlsReturn(), "3");

CancerActionButtons _cab = new CancerActionButtons();

   btnNext = new JButton("Next");
    btnPrevious = new JButton("Previous");
    btnFirst = new JButton("First");
    btnLast = new JButton("Last");
    btnClear = new JButton("Clear");

   btnNext.addActionListener(_cab);
   btnPrevious.addActionListener(_cab);

    btnFirst.addActionListener(_cab);
    btnLast.addActionListener(_cab);

CancerItemListener _item = new CancerItemListener(); // this listener works!
    renalC.addItemListener(_item);
    skinC.addItemListener(_item);
    brainC.addItemListener(_item);
    bladderC.addItemListener(_item);
    ovarianC.addItemListener(_item);
    pancC.addItemListener(_item);
    breastC.addItemListener(_item);

String[] tester;
    String teste;

    listModel = new DefaultListModel();

    for(int i = 0; i < 36; i++) {

        tester = _controller.readCancer(i);
        teste = tester[0];

        listModel.addElement(teste);

    }

    cancerList = new JList(listModel);
    cancerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    cancerList.setSelectedIndex(-1);
    cancerList.setVisibleRowCount(5);
    cancerListScroller = new JScrollPane(cancerList);
    ListSelection _list = new ListSelection();
    cancerList.addListSelectionListener(_list);

    JScrollPane treatmentsScroller = new JScrollPane(txtTreatments, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    treatmentsScroller.setViewportView(txtTreatments);
    JScrollPane causesScroller = new JScrollPane(txtCauses, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    causesScroller.setViewportView(txtCauses);
    JScrollPane symptomsScroller = new JScrollPane(txtSymptoms, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    symptomsScroller.setViewportView(txtSymptoms);

public class ListSelection implements ListSelectionListener {

    @Override
    public void valueChanged(ListSelectionEvent e) {
        String selection = (String)(((JList)e.getSource()).getSelectedValue());
        ((CardLayout) mainPanel2.getLayout()).show(mainPanel2, selection);
        ((CardLayout) mainPanel2.getLayout()).show(mainPanel2, selection);
    }

}

public class CancerActionButtons implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        switch(e.getActionCommand()) {
            case "First":
                ((CardLayout) mainPanel2.getLayout()).first(mainPanel2);    
            cancerCount = 1;                                            
                break;
            case "Last":
                ((CardLayout) mainPanel2.getLayout()).last(mainPanel2);
            cancerCount = 11;
                break;
            case "Previous":
                ((CardLayout) mainPanel2.getLayout()).previous(mainPanel2);
            cancerCount--;
            cancerCount = cancerCount < 1 ? 11 : cancerCount;
                break;
            case "Next":
                ((CardLayout) mainPanel2.getLayout()).next(mainPanel2);
            cancerCount++;
            cancerCount = cancerCount > 11 ? 1 : cancerCount;      //
                break;
        }
        cancerList.setSelectedIndex(cancerCount-1);
    }

}

/**
 * Inner class that responds to any user interaction with a JComboBox for 
 * general types of cancers. 
 */

public class CancerItemListener implements ItemListener {

    @Override
    public void itemStateChanged(ItemEvent e) {
        JPanel showPanel = new JPanel();
        if(e.getStateChange() == ItemEvent.SELECTED) {
            String selection = (String) e.getItem();
            if(selection.equalsIgnoreCase("skin cancer")) {
                CancerPanels.skin skin = new CancerPanels.skin();
                showPanel = skin.skinReturn(); 
            } else if (selection.equalsIgnoreCase("bladder cancer")) {
                CancerPanels.bladder bladder = new CancerPanels.bladder();
                showPanel = bladder.bladderReturn();
            } else if (selection.equalsIgnoreCase("pancreatic cancer")) {
                CancerPanels.pancreatic pancreatic = new CancerPanels.pancreatic();
                showPanel = pancreatic.returnPancreatic();
            } else if (selection.equalsIgnoreCase("renal cancer")) {
                CancerPanels.renal renal = new CancerPanels.renal();
                showPanel = renal.returnRenal();
            } else if (selection.equalsIgnoreCase("ovarian cancer")) {
                CancerPanels.ovarian ovarian = new CancerPanels.ovarian();
                showPanel = ovarian.ovarianReturn();
            } else if (selection.equalsIgnoreCase("breast cancer")) {
                CancerPanels.breast breast = new CancerPanels.breast();
                showPanel = breast.returnBreast();
            } else if (selection.equalsIgnoreCase("brain cancer")) {
                CancerPanels.brain brain = new CancerPanels.brain();
                showPanel = brain.returnBrain();  
            } else if (selection.equalsIgnoreCase("von hippel-lindau syndrome")) {
                CancerPanels.vhlsPanels vhls = new CancerPanels.vhlsPanels();
                showPanel = vhls.vhlsReturn();
            }
            JOptionPane.showMessageDialog(null, showPanel);
        }
    }
}        

Seperate class where the JPanels are made before being added to CardLayout:

public class CancerPanels extends CancerGUI {

static String name;
static JPanel cards;
static CancerController _cons = new CancerController();
static String[] cancerData;
static JScrollPane treatmentsScroller = new JScrollPane(txtTreatments, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
static JScrollPane causesScroller = new JScrollPane(txtCauses, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

static JScrollPane symptomsScroller = new JScrollPane(txtSymptoms, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

public static class aplPanel extends JPanel {

    public JPanel aplReturn() {
        treatmentsScroller.setViewportView(txtTreatments);
        txtTreatments.setEditable(false);
        causesScroller.setViewportView(txtCauses);
        txtCauses.setEditable(false);
        symptomsScroller.setViewportView(txtSymptoms);
        txtSymptoms.setEditable(false);
        cards = new JPanel(new GridLayout(6,1));
        cancerData = _cons.readCancer(0);
        resultName.setText(cancerData[0]);
        txtSymptoms.setText(cancerData[1]);
        txtCauses.setText(cancerData[2]);
        txtTreatments.setText(cancerData[3]);
        resultRate.setText(cancerData[4]);
        resultPrognosis.setText(cancerData[5]);
        cards.add(resultName);
        cards.add(symptomsScroller);
        cards.add(causesScroller);
        cards.add(treatmentsScroller);
        cards.add(resultRate);
        cards.add(resultPrognosis); 
        return cards;
    }

解决方案

  • In essence what you are trying to do is to change the state of one class from another.
  • How this is done with Swing GUI's is no different for how it is done for non-GUI programs: one class calls the public methods of another class.
  • One key is to have wiring to allow this to occur which means references for one class needs to be available to the other class so that appropriate methods can be called on appropriate references. The devil as they say is in the details.
  • "1) How do I get the JPanels to switch using CardLayout?" -- So the class that holds the CardLayout could for instance have the public methods, next(), previous(), and perhaps show(SOME_STRING_CONSTANT) or some other swapView(...) method.
  • "2) How do I get the data to be displayed in the GUI in text fields when a user clicks an item from the JList?" -- This will involve the use of listeners -- the class holding the JTextFields will listen for notification from the class that holds the JList, and when notified gets the necessary information from the list-displaying class. A PropertyChangeListener could work well here.

e.g.,

public class CancerSelectionListener implements ListSelectionListener {
    private CardDisplayingView cardDisplayingView = null;

    public CancerSelectionListener(CardDisplayingView cardDisplayingView) {
       this.cardDisplayingView = cardDisplayingView;
    }

    @Override
    public void valueChanged(ListSelectionEvent e) {
       int selection = ((JList) e.getSource()).getSelectedIndex();
       if(selection == 0) {
           if (cardDisplayingView != null) {
             cardDisplayingView.swapView(...);
           }
       }

    }   
}

这篇关于ListSelectionListener和CardLayout的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆