2012-07-10 106 views
1

編寫項目的程序。我需要使用ListSelectionListener來獲取JList中的當前選擇,以確定另一個面板使用的CardLayout的當前卡。我希望至少能夠通過Listener創建一個具有選擇名稱的String,如果不是直接使用CardLayout類的show方法從Listener中更改當前卡。最簡單的方法是什麼,最終導致當前的卡被更改?非常感謝您的幫助!內部類和局部變量問題

來源:

import javax.swing.*; 
import java.util.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.event.*; 

public class ClientApp extends JFrame 
{ 
    public static void main(String[] args) 
    { 
     new ClientApp(); 
    } 


    public ClientApp() 
    { 
     this.setSize(750,380); 
     this.setTitle("Honeydukes Muggle Ordering System"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel infoPanel = new JPanel(new CardLayout()); 
     JPanel invntryPanel = new JPanel(); 


     //Creating the array for the invntryPanel Jlist 

     String[] candy = {"Acid Pops", "Bat's Blood Soup", 
          "Bertie Bott's Every Flavour Beans", 
          "Blood-flavoured Lollipops", 
          "Cauldron Cakes", "Charm Choc", 
          "Chocoballs", "Chocolate Cauldrons", 
          "Chocolate Frogs", "Chocolate Skeletons", 
          "Chocolate Wands", "Choco-Loco", "Cockroach Clusters", 
          "Nougat", "Crystallised Pineapple", 
          "Drooble's Best Blowing Gum", "Exploding Bonbons", 
          "Toffees", "Fizzing Whizzbees", 
          "Fudge Flies", "Ice Mice", 
          "Jelly Slugs", "Liquourice Wands", 
          "Pepper Imps", "Peppermint Toads", 
          "Pink Coconut Ice", "Pixie Puffs", 
          "Pumpkin Fizz", "Salt Water Taffy", 
          "Shock-o-Choc", "Skeletal Sweets", 
          "Splindle's Lick'O'Rish Spiders", 
          "Sugar Quills", "Sugared Butterfly Wings", 
          "Toothflossing Stringmints", "Tooth-Splintering Strongmints", 
          "Treacle Fudge", "Chocolates", "Wizochoc"}; 
     JList candyList = new JList(candy); 
     candyList.setVisibleRowCount(18); 
     candyList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

     ListSelectionListener sl = new ListSelectionListener() { 
      public void valueChanged(ListSelectionEvent e) { 
      if (e.getValueIsAdjusting() == false) { 
       CardLayout.show(infoPanel, (String)candyList.getSelectedValue()); 
      } 
      } 
     }; 

     candyList.addListSelectionListener(sl); 

     //Creating a scrollpane for the JList 
     JScrollPane scroll = new JScrollPane(candyList, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
              JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     invntryPanel.add(scroll); 


     //Creating the cards 
     JPanel startCard = new JPanel(new BorderLayout()); 
     JPanel acidPopsCard = new JPanel(); 
     JPanel batsBloodSoupCard = new JPanel(); 
     JPanel bertieBottsCard = new JPanel(); 
     JPanel bloodPopsCard = new JPanel(); 
     JPanel cauldronCakesCard = new JPanel(); 
     JPanel charmChocCard = new JPanel(); 
     JPanel chocoballsCard = new JPanel(); 
     JPanel chocCauldronsCard = new JPanel(); 
     JPanel chocFrogsCard = new JPanel(); 
     JPanel chocSkeleCard = new JPanel(); 
     JPanel chocWands = new JPanel(); 
     JPanel chocolocoCard = new JPanel(); 
     JPanel roachClustersCard = new JPanel(); 
     JPanel nougatCard = new JPanel(); 
     JPanel crystalPineappleCard = new JPanel(); 
     JPanel droobleGumCard = new JPanel(); 
     JPanel explodeBonbonsCard = new JPanel(); 
     JPanel toffeesCard = new JPanel(); 
     JPanel fizzWhizCard = new JPanel(); 
     JPanel fudgeFliesCard = new JPanel(); 
     JPanel iceMiceCard = new JPanel(); 
     JPanel jellySlugsCard = new JPanel(); 
     JPanel liquorWandsCard = new JPanel(); 
     JPanel pepImpsCard = new JPanel(); 
     JPanel pepToadsCard = new JPanel(); 
     JPanel pinkCocoIceCard = new JPanel(); 
     JPanel pixiePuffsCard = new JPanel(); 
     JPanel pumpkFizzCard = new JPanel(); 
     JPanel saltTaffeyCard = new JPanel(); 
     JPanel shockChocCard = new JPanel(); 
     JPanel skeleSweetsCard = new JPanel(); 
     JPanel spindleSpidersCard = new JPanel(); 
     JPanel sugarQuillsCard = new JPanel(); 
     JPanel sugarWingsCard = new JPanel(); 
     JPanel flossMintsCard = new JPanel(); 
     JPanel splintMintsCard = new JPanel(); 
     JPanel treacleFudgeCard = new JPanel(); 
     JPanel chocolatesCard = new JPanel(); 
     JPanel wizochocCard = new JPanel(); 

     //Adding the cards to the infoPanel 
     infoPanel.add(startCard, "Start"); 
     infoPanel.add(acidPopsCard, "Acid Pops"); 
     infoPanel.add(batsBloodSoupCard, "Bat's Blood Soup"); 
     infoPanel.add(bertieBottsCard, "Bertie Bott's Every Flavour Beans"); 
     infoPanel.add(bloodPopsCard, "Blood-flavoured Lollipops"); 
     infoPanel.add(cauldronCakesCard, "Cauldron Cakes"); 
     infoPanel.add(charmChocCard, "Charm Choc"); 
     infoPanel.add(chocoballsCard, "Chocoballs"); 
     infoPanel.add(chocCauldronsCard, "Chocolate Cauldrons"); 
     infoPanel.add(chocFrogsCard, "Chocolate Frogs"); 
     infoPanel.add(chocSkeleCard, "Chocolate Skeletons"); 
     infoPanel.add(chocWands, "Chocolate Wands"); 
     infoPanel.add(chocolocoCard, "Choco-Loco"); 
     infoPanel.add(roachClustersCard, "Cockroach Clusters"); 
     infoPanel.add(nougatCard, "Nougat"); 
     infoPanel.add(crystalPineappleCard, "Crystallised Pineapple"); 
     infoPanel.add(droobleGumCard, "Drooble's Best Blowing Gum"); 
     infoPanel.add(explodeBonbonsCard, "Exploding Bonbons"); 
     infoPanel.add(toffeesCard, "Toffees"); 
     infoPanel.add(fizzWhizCard, "Fizzing Whizzbees"); 
     infoPanel.add(fudgeFliesCard, "Fudge Flies"); 
     infoPanel.add(iceMiceCard, "Ice Mice"); 
     infoPanel.add(jellySlugsCard, "Jelly Slugs"); 
     infoPanel.add(liquorWandsCard, "Liquourice Wands"); 
     infoPanel.add(pepImpsCard, "Pepper Imps"); 
     infoPanel.add(pepToadsCard, "Peppermint Toads"); 
     infoPanel.add(pinkCocoIceCard, "Pink Coconut Ice"); 
     infoPanel.add(pixiePuffsCard, "Pixie Puffs"); 
     infoPanel.add(pumpkFizzCard, "Pumpkin Fizz"); 
     infoPanel.add(saltTaffeyCard, "Salt Water Taffy"); 
     infoPanel.add(shockChocCard, "Shock-o-Choc"); 
     infoPanel.add(skeleSweetsCard, "Skeletal Sweets"); 
     infoPanel.add(spindleSpidersCard, "Splindle's Lick'O'Rish Spiders"); 
     infoPanel.add(sugarQuillsCard, "Sugar Quills"); 
     infoPanel.add(sugarWingsCard, "Sugared Butterfly Wings"); 
     infoPanel.add(flossMintsCard, "Toothflossing Stringmints"); 
     infoPanel.add(splintMintsCard, "Tooth-Splintering Strongmints"); 
     infoPanel.add(treacleFudgeCard, "Treacle Fudge"); 
     infoPanel.add(chocolatesCard, "Chocolates"); 
     infoPanel.add(wizochocCard, "Wizochoc"); 

     //startCard building 
     JLabel startLbl = new JLabel("<html><center>Welcome to the Honeydukes Muggle Ordering System!<br />Please select from one of our products to the left to begin!</center></html>"); 
     startCard.add(startLbl, BorderLayout.CENTER); 

     this.add(invntryPanel, BorderLayout.LINE_START); 
     this.add(infoPanel, BorderLayout.CENTER); 
     this.setVisible(true); 
    } 
} 

錯誤:

ClientApp.java:54: error: local variable infoPanel is accessed from within inner 
class; needs to be declared final 
       CardLayout.show(infoPanel, (String)candyList.getSelectedValue()) 
; 
           ^
ClientApp.java:54: error: local variable candyList is accessed from within inner 
class; needs to be declared final 
       CardLayout.show(infoPanel, (String)candyList.getSelectedValue()) 
; 
               ^
ClientApp.java:54: error: non-static method show(Container,String) cannot be ref 
erenced from a static context 
       CardLayout.show(infoPanel, (String)candyList.getSelectedValue()) 
; 
         ^
Note: ClientApp.java uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 
3 errors 
+3

將infoPanel聲明爲final,然後嘗試編譯 – Patton 2012-07-10 04:49:08

+1

您還應該聲明'candyList'爲final。你必須創建一個'CardLayout'的實例:'new CardLayout()。show(infoPanel,(String)candyList.getSelectedValue());'。 – matcauthon 2012-07-10 04:50:34

+0

無論何時我試圖做出任何最後的決定,它都會指出標識符是預期的。任何想法爲什麼?我知道它可以是任何事情。 – Sam 2012-07-10 04:57:46

回答

3

我能想到的幾種方法。首先,使參考的糖果列表最後

final JList candyList = new JList(candy); 

這應該允許內部類看到列表。就我個人而言,我不喜歡這種方法,但那只是我。

你可以嘗試其他的事情是通過事件對象

ListSelectionListener sl = new ListSelectionListener() { 
    public void valueChanged(ListSelectionEvent e) { 
     JList candyList = (JList)e.getSource(); 
     if (e.getValueIsAdjusting() == false) { 
      CardLayout.show(infoPanel, (String)candyList.getSelectedValue()); 
     } 
     } 
    }; 

引用列表或構建,可以有列表過去把它作爲參數的新的內部類

public class MyInnerListener implements ListSelectionListener { 

    private JList list; 

    public MyInnerListener(JList list) { 

     this.list = list; 

    } 
    public void valueChanged(ListSelectionEvent e) { 
     if (e.getValueIsAdjusting() == false) { 
      CardLayout.show(infoPanel, (String)list.getSelectedValue()); 
     } 
    } 

} 

剛一些想法;)

+0

非常好的想法,那些。它至少處理JList。 我一半試圖「欺騙」,只是添加JList下面的按鈕來切換當前的卡。它至少會解決不得不處理內部類的問題。 – Sam 2012-07-10 05:12:58