簡體   English   中英

如何在某些子句上禁用 JButton?

[英]How to disable a JButton on certain clause?

我正在做一個小項目,其中我有一個帶有 5 個JFrameJButtons 3 JButtons是主要關注點,默認啟用。

我想要的是直到並且除非按下這 3 個JButtons中的任何一個,否則 2 個中的 rest 應該保持禁用狀態。

我嘗試使用ActionListnerMouseListener但無濟於事。

檢查我嘗試過的多個代碼。

public void mousePressed (MouseEvent me){    
     if (me.getButton() == MouseEvent.NOBUTTON ){

        proceedBtn.setEnabled(false);
        proceedBtn.setToolTipText("Please Enter A Button Before Proceeding");
    }
    else {                   
        proceedBtn.setEnabled(true);        
    }

}

這是我嘗試過的另一段代碼。

public void mousePressed (MouseEvent me){    
     if (me.getClickCount == 0 ){

        proceedBtn.setEnabled(false);
        proceedBtn.setToolTipText("Please click a button Before Proceeding");
    }
    else {                   
        proceedBtn.setEnabled(true);        
    }

}

我在這里做錯了什么? 我什至為相同的代碼嘗試了mouseClicked方法,但什么也沒發生。

您需要了解ActionListener class。 正如@harper89建議的那樣,甚至還有一個關於如何編寫動作監聽器的教程。 我還建議您將JButton子類化,因為這似乎比查詢ActionEvent的源更合適。


這是一個例子 -

public final class JButtonDemo {
    private static DisabledJButton disabledBtnOne;
    private static DisabledJButton disabledBtnTwo;

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                createAndShowGUI();             
            }
        });
    }

    private static void createAndShowGUI(){
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        final JPanel disabledBtnPanel = new JPanel();
        disabledBtnOne = new DisabledJButton();
        disabledBtnTwo = new DisabledJButton();
        disabledBtnPanel.add(disabledBtnOne);
        disabledBtnPanel.add(disabledBtnTwo);
        panel.add(disabledBtnPanel);

        final JPanel enablerBtnPanel = new JPanel();
        enablerBtnPanel.add(new EnablerJButton("Button 1"));
        enablerBtnPanel.add(new EnablerJButton("Button 2"));
        enablerBtnPanel.add(new EnablerJButton("Button 3"));
        panel.add(enablerBtnPanel);

        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static final class DisabledJButton extends JButton{
        public DisabledJButton(){
            super("Disabled");
            setEnabled(false);
        }
    }

    private static final class EnablerJButton extends JButton{
        public EnablerJButton(final String s){
            super(s);
            addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(!disabledBtnOne.isEnabled()){
                        disabledBtnOne.setEnabled(true);
                        disabledBtnOne.setText("Enabled");
                    }

                    if(!disabledBtnTwo.isEnabled()){
                        disabledBtnTwo.setEnabled(true);
                        disabledBtnTwo.setText("Enabled");
                    }
                }
            });
        }
    }
}

在此處輸入圖像描述


如果您按下三個啟用按鈕中的任何一個,則兩個禁用的按鈕都將根據您的要求啟用。

我想知道如果使用切換類型的按鈕(例如 JToggleButton 或其子項之一(JRadioButton 或 JCheckBox))編寫代碼會更好。 這樣,用戶可以查看下部按鈕是否被選中或“激活”。 這也將允許您控制用戶是否可以檢查三個底部按鈕中的一個或多個,或者只檢查一個底部按鈕(通過使用 ButtonGroup 對象)。 例如,並為部分竊取他的代碼向 mre 道歉(他的回答為 1+):

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

public class JButtonDemo2 {
   private static final String[] TOGGLE_NAMES = { "Monday", "Tuesday",
         "Wednesday" };
   private JPanel mainPanel = new JPanel();
   private JButton leftButton = new JButton("Left");
   private JButton rightButton = new JButton("Right");

   private JToggleButton[] toggleBtns = new JToggleButton[TOGGLE_NAMES.length];

   public JButtonDemo2() {
      JPanel topPanel = new JPanel();
      topPanel.add(leftButton);
      topPanel.add(rightButton);
      leftButton.setEnabled(false);
      rightButton.setEnabled(false);

      CheckListener checkListener = new CheckListener();
      JPanel bottomPanel = new JPanel(new GridLayout(1, 0, 5, 0));
      for (int i = 0; i < toggleBtns.length; i++) {

         // uncomment one of the lines below to see the program 
         // with check boxes vs. radio buttons, vs toggle buttons
         toggleBtns[i] = new JCheckBox(TOGGLE_NAMES[i]);
         // toggleBtns[i] = new JRadioButton(TOGGLE_NAMES[i]);
         // toggleBtns[i] = new JToggleButton(TOGGLE_NAMES[i]);


         toggleBtns[i].setActionCommand(TOGGLE_NAMES[i]);
         toggleBtns[i].addActionListener(checkListener);
         bottomPanel.add(toggleBtns[i]);
      }

      mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
      mainPanel.add(topPanel);
      mainPanel.add(bottomPanel);
   }

   public JComponent getMainComponent() {
      return mainPanel;
   }

   public void enableTopButtons(boolean enable) {
      leftButton.setEnabled(enable);
      rightButton.setEnabled(enable);
   }

   private class CheckListener implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         for (JToggleButton checkBox : toggleBtns) {
            if (checkBox.isSelected()) {
               enableTopButtons(true);
               return;
            }
         }
         enableTopButtons(false);
      }

   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("JButtonDemo2");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new JButtonDemo2().getMainComponent());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

如果您想使用 JToggleButtons 查看此代碼,請注釋掉創建 JCheckBoxes 的行並取消注釋創建 JToggleButtons 的行:

     // toggleBtns[i] = new JCheckBox(TOGGLE_NAMES[i]);
     // toggleBtns[i] = new JRadioButton(TOGGLE_NAMES[i]);
     toggleBtns[i] = new JToggleButton(TOGGLE_NAMES[i]);

同樣,如果您想查看帶有 JRadioButtons 的程序,只需取消注釋 JRadioButton 行並注釋其他兩個。

我相信您可以查看按鈕的actionListeners

然后,當單擊前三個按鈕之一時,您可以對.setenabled = true執行簡單的if語句。

我以前做過,但不太願意說明如何做。 生病包括一些應該工作的代碼和一個可能比我解釋得更好的教程。

例子:

JButtonOne.addActionListener(new ButtonHandler();)

private class ButtonHandler implements ActionListener{
public void actionPerformed(ActionEvent event) {

//write your if statement or call a method etc here

}
}

動作監聽器教程

嘗試將鼠標監聽器放在正常活動的按鈕上。 這樣,當它們激活時,它們可以啟用通常不活動的按鈕。 此外,將通常不活動的按鈕設置為在應用程序首次啟動時禁用。

嘗試使用 MouseEvent 的getComponent

if(mouseEvent.getComponent() == aButton) {

}

文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM