Как отключить JButton на определенное предложение? - PullRequest
3 голосов
/ 09 августа 2011

Я делаю небольшой проект, и в нем у меня есть JFrame с 5 JButtons. 3 JButtons имеют первостепенное значение и включены по умолчанию.

То, что я хочу, это до тех пор, пока ни один из этих 3 JButtons не будет нажат, остальная часть 2 должна оставаться отключенной.

Я пробовал с ActionListner и MouseListener, но безрезультатно.

Проверьте код, который я пробовал.

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 для того же кода, но ничего не произошло.

Ответы [ 5 ]

6 голосов
/ 09 августа 2011

Вам необходимо понять класс ActionListener .* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.Я также предлагаю вам подкласс 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");
                    }
                }
            });
        }
    }
}

enter image description here


Если вы нажмете одну из трех включенных кнопок, обе отключенные кнопки станут активными в соответствии с вашим запросом.

4 голосов
/ 10 августа 2011

Интересно, будет ли код лучше с кнопкой типа переключателя, такой как 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 и прокомментируйте две другие.

3 голосов
/ 09 августа 2011

Полагаю, вы можете посмотреть на actionListeners для своей кнопки.

Тогда вы можете сделать свой простой оператор if для .setenabled = true, когда нажмете одну из первых трех кнопок.

Я делал их раньше, но мне неудобно пытаться объяснить, как. Я включу некоторый код, который должен работать, и учебник, который может объяснить это лучше меня.

Пример:

JButtonOne.addActionListener(new ButtonHandler();)

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

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

}
}

Учебник по Actionlistener

0 голосов
/ 09 августа 2011

Попробуйте поставить слушателей мыши на нормально активных кнопках.Таким образом, когда они активируются, они могут включать обычно неактивные кнопки.Кроме того, обычно отключайте обычно неактивные кнопки при первом запуске приложения.

0 голосов
/ 09 августа 2011

Попробуйте с getComponent MouseEvent:

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

}

Docs

...