2011-07-26 41 views
4

,所以我必須爲我的GUI這一小塊代碼:如何禁用GUI按鈕在Java中

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.BoxLayout; 
import javax.swing.JSeparator; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 


public class IPGUI extends JFrame implements ActionListener 
{ 
    private static JPanel contentPane; 
    private static boolean btn1Clicked = false; 
    private static boolean btn2Clicked = false; 
    private static boolean btn3Clicked = false; 
    private static boolean btn4Clicked = false; 

    //Create the frame 
    public IPGUI() 
    { 
     //Sets frame properties 
     setTitle("IP Extractor"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 250, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     //Creates new JPanel with boxlayout 
     JPanel panel = new JPanel(); 
     contentPane.add(panel, BorderLayout.CENTER); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

     //////////////////New Button////////////////// 

     JButton btnConvertDocuments = new JButton("1. Convert Documents"); 
     btnConvertDocuments.setAlignmentX(Component.CENTER_ALIGNMENT); 
     btnConvertDocuments.setMaximumSize(new Dimension(160, 0)); 
     btnConvertDocuments.setPreferredSize(new Dimension(0, 50)); 

     panel.add(btnConvertDocuments); 

     btnConvertDocuments.setActionCommand("w"); 
     btnConvertDocuments.addActionListener((ActionListener) this); 

     if (btn1Clicked == true) 
     { 
      btnConvertDocuments.setEnabled(false); 
     } 

     JSeparator separator_3 = new JSeparator(); 
     panel.add(separator_3); 

     //////////////////New Button////////////////// 

     JButton btnExtractImages = new JButton("2. Extract Images"); 
     btnExtractImages.setAlignmentX(Component.CENTER_ALIGNMENT); 
     btnExtractImages.setMaximumSize(new Dimension(160, 0)); 
     btnExtractImages.setPreferredSize(new Dimension(0, 50)); 

     panel.add(btnExtractImages); 

     btnExtractImages.setActionCommand("x"); 
     btnExtractImages.addActionListener((ActionListener) this); 

     if (btn2Clicked == true) 
     { 
      btnExtractImages.setEnabled(false); 
     } 

     JSeparator separator_2 = new JSeparator(); 
     panel.add(separator_2); 

     //////////////////New Button////////////////// 

     JButton btnParseRIDValues = new JButton("3. Parse rId Values"); 
     btnParseRIDValues.setAlignmentX(Component.CENTER_ALIGNMENT); 
     btnParseRIDValues.setMaximumSize(new Dimension(160, 0)); 
     btnParseRIDValues.setPreferredSize(new Dimension(0, 50)); 

     panel.add(btnParseRIDValues); 

     btnParseRIDValues.setActionCommand("y"); 
     btnParseRIDValues.addActionListener((ActionListener) this); 

     if (btn3Clicked == true) 
     { 
      btnParseRIDValues.setEnabled(false); 
     } 

     JSeparator separator_1 = new JSeparator(); 
     panel.add(separator_1); 

     //////////////////New Button////////////////// 

     JButton btnParseImageInfo = new JButton("4. Parse Image Info."); 
     btnParseImageInfo.setAlignmentX(Component.CENTER_ALIGNMENT); 
     btnParseImageInfo.setMaximumSize(new Dimension(160, 0)); 
     btnParseImageInfo.setPreferredSize(new Dimension(0, 50)); 

     panel.add(btnParseImageInfo); 

     btnParseImageInfo.setActionCommand("z"); 
     btnParseImageInfo.addActionListener((ActionListener) this); 

     if (btn4Clicked == true) 
     { 
      btnParseImageInfo.setEnabled(false); 
     } 
    } 

    public void actionPerformed(ActionEvent event) 
    { 
     String command = event.getActionCommand(); 

     if (command.equals("w")) 
     { 
      FileConverter fc = new FileConverter(); 
      btn1Clicked = true; 
     } 
     else if (command.equals("x")) 
     { 
      ImageExtractor ie = new ImageExtractor(); 
      btn2Clicked = true; 
     } 
     else if (command.equals("y")) 
     { 
      XMLIDParser xip = new XMLIDParser(); 
      btn3Clicked = true; 
     } 
     else if (command.equals("z")) 
     { 
      XMLTagParser xtp = new XMLTagParser(); 
      btn4Clicked = true; 
     } 
    }  
} 

我要特別關注的部分,這是有條件的:

if (btn1Clicked == true) 
     { 
      btnConvertDocuments.setEnabled(false); 
     } 

所以我相信的是,該命令應該做的是,一旦按鈕被點擊並調用了執行的動作方法,btnClicked應該被設置爲true,因此該按鈕應該被禁用。

有人可以解釋我在哪裏錯了,或者我在這裏有正確的想法嗎?提前感謝您的任何意見!

+0

你還沒有聲明,如果它沒有做你想做的。我知道這很明顯,但當你點擊按鈕會發生什麼?任何錯誤? – DaMainBoss

+0

它只是不禁用按鈕,用戶可以反覆點擊按鈕(我不想)。不過,我現在修好了。謝謝你:)。 –

+0

看到我的回覆下面 – DaMainBoss

回答

7

您應該在actionPerformed(ActionEvent event)方法中聲明btnConvertDocuments.setEnabled(false);。上面的條件僅在實例化IPGUI對象時纔會在構造函數中調用一次。

if (command.equals("w")) { 
    FileConverter fc = new FileConverter(); 
    btn1Clicked = true; 
    btnConvertDocuments.setEnabled(false); 
} 
+0

嗯,我試過了,但它的問題是,btnConvertDocuments是一個局部變量。我可以把它變成一個靜態變量,我只是想知道這樣做是否有害處? –

+0

然後使'btnConvertDocuments'成爲一個實例變量。不要讓它變成靜態的。 – user802421

+0

完成。非常感謝你! –

2

一旦你創建了框架,你的條件代碼的一部分將不會被輸入。換句話說,在您執行測試if (btn1Clicked == true) 時,該按鈕不僅沒有被點擊,甚至沒有被顯示給用戶。

丟失布爾值,並將帶有btnConvertDocuments.setEnabled(false)的行移動到actionListener中。製作按鈕實例變量,不要讓它們成爲靜態變量。 (或者,您可以將按鈕保留爲局部變量,併爲每個按鈕分配他們自己的匿名內部類偵聽器。)

2

您可以使用按鈕啓用創建框架,執行一些測試以查看btn1Cliked是否爲true,這就是全部。

然後你有actionPerformed方法,它不會對你的按鈕做任何事情。所以,如果你沒有任何相關的動作,你的按鈕狀態將不會再被評估。

3

與其使用布爾值,不如在點擊時將按鈕設置爲false,以便在actionPerformed方法中這樣做。它更有效..

if (command.equals("w")) 
{ 
    FileConverter fc = new FileConverter(); 
    btnConvertDocuments.setEnabled(false); 
} 
2

有你沒有做類似的理由:

public class IPGUI extends JFrame implements ActionListener 
{ 
    private static JPanel contentPane; 

    private JButton btnConvertDocuments; 
    private JButton btnExtractImages; 
    private JButton btnParseRIDValues; 
    private JButton btnParseImageInfo; 

    public IPGUI() 
    { 
     ... 

     btnConvertDocuments = new JButton("1. Convert Documents"); 

     ... 

     btnExtractImages = new JButton("2. Extract Images"); 

     ... 

     //etc. 
    } 

    public void actionPerformed(ActionEvent event) 
    { 
     String command = event.getActionCommand(); 

     if (command.equals("w")) 
     { 
      FileConverter fc = new FileConverter(); 
      btnConvertDocuments.setEnabled(false); 
     } 
     else if (command.equals("x")) 
     { 
      ImageExtractor ie = new ImageExtractor(); 
      btnExtractImages.setEnabled(false); 
     } 

     // etc. 
    }  
} 

if聲明與禁用的代碼將不會被執行,除非你把調用IPGUI構造。

+0

非常感謝你,先生。不,沒有特別的原因,只是我的代碼結構。我會給你答案,但用戶之前說過,我的道歉。不過謝謝你。 –

+0

很高興能幫到你! – ssell

2
import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.BoxLayout; 
import javax.swing.JSeparator; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 


public class IPGUI extends JFrame implements ActionListener 
{ 
    private static JPanel contentPane; 

    private JButton btnConvertDocuments; 
    private JButton btnExtractImages; 
    private JButton btnParseRIDValues; 
    private JButton btnParseImageInfo; 

    //Create the frame 
    public IPGUI() 
    { 
     //Sets frame properties 
     setTitle("IP Extractor"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 250, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     //Creates new JPanel with boxlayout 
     JPanel panel = new JPanel(); 
     contentPane.add(panel, BorderLayout.CENTER); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

     //////////////////New Button////////////////// 

     JButton btnConvertDocuments = new JButton("1. Convert Documents"); 
     btnConvertDocuments.setAlignmentX(Component.CENTER_ALIGNMENT); 
     btnConvertDocuments.setMaximumSize(new Dimension(160, 0)); 
     btnConvertDocuments.setPreferredSize(new Dimension(0, 50)); 

     panel.add(btnConvertDocuments); 

     btnConvertDocuments.setActionCommand("w"); 
     btnConvertDocuments.addActionListener((ActionListener) this); 

     JSeparator separator_3 = new JSeparator(); 
     panel.add(separator_3); 

     //////////////////New Button////////////////// 

     btnExtractImages = new JButton("2. Extract Images"); 
     btnExtractImages.setAlignmentX(Component.CENTER_ALIGNMENT); 
     btnExtractImages.setMaximumSize(new Dimension(160, 0)); 
     btnExtractImages.setPreferredSize(new Dimension(0, 50)); 

     panel.add(btnExtractImages); 

     btnExtractImages.setActionCommand("x"); 
     btnExtractImages.addActionListener((ActionListener) this); 

     JSeparator separator_2 = new JSeparator(); 
     panel.add(separator_2); 

     //////////////////New Button////////////////// 

     JButton btnParseRIDValues = new JButton("3. Parse rId Values"); 
     btnParseRIDValues.setAlignmentX(Component.CENTER_ALIGNMENT); 
     btnParseRIDValues.setMaximumSize(new Dimension(160, 0)); 
     btnParseRIDValues.setPreferredSize(new Dimension(0, 50)); 

     panel.add(btnParseRIDValues); 

     btnParseRIDValues.setActionCommand("y"); 
     btnParseRIDValues.addActionListener((ActionListener) this); 

     JSeparator separator_1 = new JSeparator(); 
     panel.add(separator_1); 

     //////////////////New Button////////////////// 

     JButton btnParseImageInfo = new JButton("4. Parse Image Info."); 
     btnParseImageInfo.setAlignmentX(Component.CENTER_ALIGNMENT); 
     btnParseImageInfo.setMaximumSize(new Dimension(160, 0)); 
     btnParseImageInfo.setPreferredSize(new Dimension(0, 50)); 

     panel.add(btnParseImageInfo); 

     btnParseImageInfo.setActionCommand("z"); 
     btnParseImageInfo.addActionListener((ActionListener) this); 
    } 

    public void actionPerformed(ActionEvent event) 
    { 
     String command = event.getActionCommand(); 

     if (command.equals("w")) 
     { 
      FileConverter fc = new FileConverter(); 
      btnConvertDocuments.setEnabled(false); 
     } 
     else if (command.equals("x")) 
     { 
      ImageExtractor ie = new ImageExtractor(); 
      btnExtractImages.setEnabled(false); 
     } 
     else if (command.equals("y")) 
     { 
      XMLIDParser xip = new XMLIDParser(); 
      btnParseRIDValues.setEnabled(false); 
     } 
     else if (command.equals("z")) 
     { 
      XMLTagParser xtp = new XMLTagParser(); 
      btnParseImageInfo.setEnabled(false);   
     } 
    } 


} 

這是我想出的解決方案,謝謝大家的幫助。再次感謝大家的投入,非常感謝!

4

真的無法禁用JComponent(s)如果輸出到GUI從Listener調用,在所有情況下,所有的活動都在裏面EDT包括setEnabled/setVisible

JComponent(s)是/禁用/可見如果EDT所有活動結束時,

有沒有辦法

1/safiest辦法是尋找GlassPane,防止畢竟MouseEvents (不KeyEvents)最好的代碼周圍是camickr's

2 /使用與SwingWorker單獨和延緩混凝土事件(一個或多個),Action from JComponent -> disable JComponent(s) in GUI -> then required Action,但多線程有(如果有可能增加),你必須使用來識別所有行動myAction#putProperty("String","String")

3 /把Enabled/VisibleinvokeLater()和監聽所有行動都必須包到invokeAndWait()

4 /內Runnable()#Thread

0

而不是使用布爾,爲什麼不設置該按鈕在點擊時爲false,所以你在actionPerformed方法中這樣做。它更高效..

if (command.equals("w")) 
{ 
    FileConverter fc = new FileConverter(); 
    btnConvertDocuments.setEnabled(false); 
}