2012-04-26 95 views
0

我寫了一個小程序,將切換數量L & F 只需從列表中選擇L & F,按鈕將看起來不同。當第二次機會在java中的外觀和感覺

,我初學者用java :)

這是我的代碼

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    // TODO add your handling code here: 

int selectedIndices[] = jList1.getSelectedIndices(); 
try { 
for (int j = 0; j < selectedIndices.length; j++){ 
if(j == 0){ 
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); 
    SwingUtilities.updateComponentTreeUI(this); 
      this.pack(); 
} 
if(j == 1){ 
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
SwingUtilities.updateComponentTreeUI(this); 
       this.pack(); 
} 
if(j == 2){ 
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
SwingUtilities.updateComponentTreeUI(this); 
      // this.pack(); 
} 
if(j == 3){ 
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
    SwingUtilities.updateComponentTreeUI(this); 
      this.pack(); 
} 
} 
} 
catch (Exception e) { 
       } 
    } 
+0

你曾經有超過1個選擇的指標嗎?使用j只是一個索引變量似乎不正確... – ControlAltDel 2012-04-26 18:16:02

回答

3

如果只有一個項目被選中(我想是這樣的情況),您的代碼將始終選擇的MotifLookAndFeel:

  • selectedIndices.length是1
  • 因此
  • Ĵ,在你的for循環,將僅取0作爲值
  • MotifLookAndFeel被選中。

你可能想要做這樣的事情,而不是:

switch (jList1.getSelectedIndex()) { 
    case 0: 
     //select 1st L&F 
     return; 
    case 1: 
     //select 2nd L&F 
     return; 
    case 2: 
     //select 3rd L&F 
     return; 
} 
+0

非常感謝 – imalak 2012-04-26 19:47:24

1

沒有與此代碼的幾個問題。

  1. 您遍歷數組for (int j = 0; j < selectedIndices.length; j++)但你的陣列selectedIndices[j]中從來不使用的條目。相反,您只需使用j
  2. 現在你已經硬編碼,當j==0你將使用MotifLookAndFeel。通常,您可以使用selectedIndex從列表中檢索數據(=外觀的標識符),然後使用該標識符來更改外觀
  3. 將代碼與try{} catch(Exception e){}環繞在一起是非常糟糕的做法。例如,你捕獲所有的Exception,檢查異常和運行時異常。此外,您不會對異常做任何事情。至少在catch區塊中撥打e.printStackTrace()電話,以便您確實知道發生了問題
  4. 以我個人的體驗,從外觀轉換到標準外觀(金屬)轉換爲系統特定外觀和感覺。但是從金屬 - 特定操作系統 - Nimbus - Metal - ....切換導致奇怪的結果。

只是讓你去,我會寫的代碼更象(非編譯僞代碼來說明上面提到的問題我)

//where the list is created 
//only allow single selection since I cannot set multiple L&F at the same time  
jList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

//button handling 
int selectedIndex = jList1.getSelectedIndex(); 
if (selectedIndex == -1) { return; } //no selection 
MyLookAndFeelIdentifier identifier = jList1.getModel().getElementAt(selectedIndex); 
try{ 
    UIManager.setLookAndFeel(identifier.getLookAndFeel()); 
} catch (UnsupportedLookAndFeelException e){  
    e.printStackTrace(); 
} 
+0

*「特定於操作系統 - Nimbus - Metal - ....導致出現奇怪的結果。」* Nimbus因引入奇怪的GUI工件而臭名昭着。 :( – 2012-04-26 19:58:08

+0

@AndrewThompson我也遇到過與其他L&Fs(Motif,Kunstoff,...)。從金屬切換到其中之一併返回是沒有問題的,但是從非金屬切換到另一個非金屬幾乎總是會導致我有印象JDK1.6改進了這一點(1.4和1.5只是一場災難),但它還遠未完善 – Robin 2012-04-26 20:44:39