2009-11-21 198 views
2

我寫了下面這段代碼,它應該返回一個複選框和一個按鈕的面板。這個想法是,只有在複選框被選中的情況下才能啓用該按鈕。 它的工作原理,這意味着如果複選框沒有選中,我嘗試按下按鈕,什麼也沒有發生。但是,按鈕的外觀不正確,當它顯示爲啓用時,它顯示爲禁用,反之亦然。 任何想法我的代碼有什麼問題? 感謝很多提前啓用/禁用AWT按鈕

public Panel createCalibrationPanel(final ImagePlus imp) { 
    final Panel panel = new Panel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); 
    panel.add(Box.createHorizontalStrut(20)); 
    final Checkbox checkbox = new Checkbox(
      "Use image spatial calibration for q scale", true); 
    final Button button = new Button("Set scale"); 
    useCalibration = checkbox.getState(); 
    button.setEnabled(checkbox.getState()); 
    panel.add(checkbox); 
    panel.add(button); 
    checkbox.addItemListener(new ItemListener() { 
     public void itemStateChanged(final ItemEvent e) { 
      boolean state = checkbox.getState(); 
      setUseCalibration(state); 
      button.setEnabled(state); 
     } 
    }); 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(final ActionEvent e) { 
      imp.unlock(); 
      IJ.run(imp, "Set Scale...", ""); 
      imp.lock(); 
     } 
    }); 
    return panel; 
} 
+0

如果您刪除了與實際問題無關的所有代碼並僅粘貼相關代碼,那麼看看發生了什麼(並自己嘗試)會容易得多。你也可能會發現,在這樣做的時候,你解決了自己的問題。 –

+0

對不起,我會清理我的代碼。 – Sebastien

回答

0

我敢肯定你正在做正確的一切,我的測試孔這一點。我刪除了圖像引用和操作代碼,並且該按鈕按預期運行。

我在Ubuntu Linux上從Sun運行JDK 6。但這應該沒有什麼區別。

我不知道imp.lock()是否在做一件令人髮指的事。如果這是與同步和併發處理相關的那種鎖定,那麼它看起來直覺上是錯誤的,因爲在程序的大部分生命週期中,你都會將可憐的imp鎖住。無論如何,你可以看看當你註釋掉動作碼時會發生什麼。

+0

lock()告訴ImageJ imp不可用於任何* OTHER *插件來處理它。所以圖像沒有鎖定在當前正在運行的插件(不知道我完全清楚)。 – Sebastien

1

控制按鈕的邏輯是正確的。我修改了您的示例代碼,並按照您的描述進行工作。 (這是我使用的版本:http://pastebin.com/f6cd6cfac,在Sun Java 6上測試過)。

但是,還有一些其他方法可供您調用,但您尚未向我們顯示:setUseCalibration,imp.unlock和IJ.run。你確定他們回來了嗎?您應該從代碼中刪除外部呼叫,並將它們重新添加回去,直到找到哪個問題導致問題。

+0

我不知道這是否與我在macos下使用java有關?今晚我會在Windows機器上嘗試一下。同時,刪除所有不相關的代碼不會改變任何東西...... – Sebastien

+0

這就是我想聽到的。如果「裸機」的代碼工作不正確,那麼它就是史蒂夫喬布斯的錯誤:)(或者至少有證據表明這種影響正在上升)。 –

+0

我確認...試了一個窗口盒子上的完整程序,它工作得很好......誰說窗口有問題......在ImageJ框架中,實際上存在一種叫做「isMacOSX()」的方法,它告訴很多... – Sebastien

0

我無法在64位OpenSuse 11.0上使用Sun Java 6來重現問題。但是,這並不意味着代碼是正確的。它恰好適用於我今天的機器,OS和JRE。

從你的描述中聽起來像button.setEnabled(state)沒有更新按鈕的外觀,所以我想知道是否在調用之後直接添加button.repaint()會使它工作嗎?這不僅僅是一個解決方案的實驗,因爲即使它工作,它也不能解釋爲什麼你的原始代碼爲我運行而不是爲你運行。

無論哪種方式,我猜想之一:

  • 東西,該代碼的調用方式。
  • 庫中的某些代碼。
  • JRE中的錯誤(如果是Sun JRE,您可以搜索數據庫的錯誤 )。
  • 線程問題(確保AWT代碼在 EventDispatchThread上運行,並在線程之間共享的可變數據成員上同步)。
+0

也許我的錯誤的原因是項目#4,因爲我沒有做任何特別的線程。事情是這個代碼是ImageJ插件的一部分,ImageJ應該處理這個。對於它的價值,如果我用JButton替換Buttons,問題不會發生。 – Sebastien

+0

哦,順便說一下!我試圖重繪()...沒有工作! – Sebastien