代码之家  ›  专栏  ›  技术社区  ›  Ashley

JButtons在被禁用后重新启用

  •  0
  • Ashley  · 技术社区  · 16 年前

    我有一个JButtons数组,形成一个键盘接口。输入六个数字后,我想禁用键盘,这样用户就不能再输入更多的数字了。

    我已经编写了代码,按钮确实禁用了,直到鼠标悬停在其中任何一个按钮上,然后按钮似乎重新启用自己并运行添加到它们的actionEvents。

    here .

    我认为可能是错的。

    1. 有一种鼠标听器,当我设置时忽略了它 button.setEnabled(false);
    2. 我没有把属性和 buildGUI(); 正确地说,我这样做只是为了内部类可以访问它们。
    3. 可能是因为 gridLayout 就像禁用按钮一样 似乎 services J面板按钮。
    4 回复  |  直到 16 年前
        1
  •  3
  •   Noel Ang    16 年前

    问题在于如何实例化框架( CashMachine ),而不是(直接)实施。

    buildGUI 两次,一次在对象的构造函数中,然后在 Driver 实例化对象的类。因此,您正在创建(和布局)

    当第一组按钮最终被禁用时,您的鼠标活动显示了第二组按钮。ActionListener实现中的缺陷会导致 inputCount 值大于6,因此第二组中的按钮最终不会像第一组中的按钮那样被禁用。

    构建GUI 应该是私人的;它应该在cashmache构造函数中调用,而不是由您的 班级。

    CashMachine.setVisible 应该由 班级,而不是学校 提款机

        2
  •  1
  •   Engin Kayraklioglu    16 年前

        3
  •  1
  •   trashgod    16 年前

    Clear Enter . 考虑使用单个侦听器分别处理数字键,如 NumberButton 类别如下所示。然后你就可以处理 输入 按钮。另外,使用 List<NumberButton> 使启用和禁用循环更容易。

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    
    public class KeyPadPanel extends JPanel implements ActionListener {
    
        private static final int MAX = 6;
        private final List<NumberButton> numbers = new ArrayList<NumberButton>();
        private final JTextArea text = new JTextArea(1, MAX);
        private final JButton clear = new JButton("Clear");
        private final JButton enter = new JButton("Enter");
    
        public KeyPadPanel() {
            super(new BorderLayout());
    
            JPanel display = new JPanel();
            text.setEditable(false);
            display.add(text);
            this.add(display, BorderLayout.NORTH);
    
            JPanel pad = new JPanel(new GridLayout(4, 4));
            for (int i = 0; i < 10; i++) {
                NumberButton n = new NumberButton(i);
                numbers.add(n);
                if (i > 0) {
                    pad.add(n);
                }
            }
            pad.add(clear);
            pad.add(numbers.get(0));
            pad.add(enter);
            clear.addActionListener(this);
            enter.addActionListener(this);
            this.add(pad, BorderLayout.CENTER);
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            text.setText("");
            enableButtons();
        }
    
        private void enableButtons() {
            for (NumberButton n : numbers) {
                n.setEnabled(true);
            }
        }
    
        private void disableButtons() {
            for (NumberButton n : numbers) {
                n.setEnabled(false);
            }
        }
    
        private class NumberButton extends JButton implements ActionListener {
    
            public NumberButton(int number) {
                super(String.valueOf(number));
                this.addActionListener(this);
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                NumberButton b = (NumberButton) e.getSource();
                if (text.getText().length() < MAX) {
                    text.append(b.getText());
                }
                if (text.getText().length() == MAX) {
                    disableButtons();
                }
            }
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    JFrame f = new JFrame();
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    f.add(new KeyPadPanel());
                    f.pack();
                    f.setVisible(true);
                }
            });
        }
    }
    
        4
  •  1
  •   user85421    16 年前

    检查类文件很有帮助!问题出在Driver类中: 这个 buildGUI() 方法被调用了两次:一次在cashmache的构造函数中,第二次在 main

    public static void main(String args[])
    {
        CashMachine cashmachine = new CashMachine();
        cashmachine.buildGUI();
    }
    


    把电话转到 buildGUI 主要的 (或来自建造商)。
    (我会改变 构建GUI 因为它不应该从类外调用…)