2014-01-07 50 views
1

我有2個JPanel(LeftPanel和RightPanel)。如何將只讀模式設置爲JPanel

RightPanel有4個JRadioButtons,其中一個通過設置setSelected(true)進行選擇。

我的要求是以只讀模式顯示RightPanel。

你能幫我解決這個問題嗎?

JPanel RightPanel=new JPanel(); 
RightPanel.removeMouseListener(null); 

示例代碼會有幫助。

+0

你可以去看一下的glassPane,或JLayer消耗事件 – nachokk

回答

2

最簡單的選擇是你在JPanel內的所有組件上做setEnabled(false);。您還可以使用setEditable(false);作爲文本組件,如JTextField,JTextArea,JEditorPanel

+0

如果我設置的setEnabled(false)來選擇JRadioButton組件那麼它西港島線成爲變灰out.Is有什麼辦法像我們之前看到的一樣顯示? –

+1

*「有什麼方法可以像我們以前看到的一樣顯示嗎?」*這會讓用戶感到困惑。我推薦使它變灰。 –

3

我會建議你看看JLayer,你可以讓你自己消耗所有的事件。看看教程How to Decorate Components with the JLayer Class。你需要Java 7+來使用這個類。

簡單的例子:

import java.awt.AWTEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseEvent; 
import javax.swing.JCheckBox; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JLayer; 
import javax.swing.JPanel; 
import javax.swing.plaf.LayerUI; 

public class Test { 


    public static void main(String args []){ 
     JFrame frame = new JFrame(); 
     frame.setTitle("Test checkbox"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Test checkbox")); 
     JCheckBox checkbox = new JCheckBox(); 
     LayerUI<JComponent> layerUI = new MyLayerUISubclass(); 
     JLayer<JComponent> jlayer = new JLayer<>(checkbox, layerUI); 

     panel.add (jlayer); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 

    } 



    static class MyLayerUISubclass extends LayerUI<JComponent>{ 


     @Override 
     public void installUI(JComponent c) { 
      super.installUI(c); 
      JLayer jlayer = (JLayer)c; 
      jlayer.setLayerEventMask(
        AWTEvent.MOUSE_EVENT_MASK | 
        AWTEvent.KEY_EVENT_MASK 
        ); 

     } 

     @Override 
     public void uninstallUI(JComponent c) { 
      JLayer jlayer = (JLayer)c; 
      jlayer.setLayerEventMask(0); 
      super.uninstallUI(c); 
     } 


     @Override 
     protected void processMouseEvent(MouseEvent e, JLayer l) { 
      e.consume(); 
     } 





     @Override 
     protected void processKeyEvent(KeyEvent e, 
       JLayer<? extends JComponent> l) { 
      e.consume(); 
     } 



    } 
} 
+0

是的......這正是我想要的。非常感謝 !!! –

+0

@SithikSweetRascal不客氣,考慮接受綠色標記的答案:) – nachokk