Java - 如何通过按另一个JButton来隐藏JButton?

时间:2016-04-06 19:13:23

标签: java swing nullpointerexception jbutton jlabel

我需要写一个简单的程序:

  1. 三个按钮 GEN - 生成一个数字 HEX - 将我的数字计算为十六进制数 DEC - 将我的数字计算为十进制数

  2. 的JLabel 它显示数字。

  3. 当我的号码是DECIMAL时,DEC按钮应该隐藏,当我的号码是HEXADECIMAL时,HEX按钮应该隐藏。

    当我生成例如第三个数字时,当prevoius生成的数字也是HEXADECIMAL时,它必须生成HEXADECIMAL数字。

    以下是我已经完成的事情:

    GUI

    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Random;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    public class Okno {
    
        private JFrame okno;
        private JButton DecButt, HexButt, GenerujButt;
        private JLabel label_num;
    
    
    
        public JButton getDecButt() {
            return DecButt;
        }
        public void setDecButt(JButton decButt) {
            DecButt = decButt;
        }
        public JButton getHexButt() {
            return HexButt;
        }
        public JLabel getLabel_num() {
            return label_num;
        }
    
    
    
        public void createGUI() {
            okno = new JFrame("Okienko");
            okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            okno.setSize(400, 300);
            okno.setLayout(new GridBagLayout());
    
    
            //rzytowanie liczby na String zeby wyswietlic
            label_num = new JLabel();
            okno.add(label_num);
    
            //przyciski
            DecButt = new JButton("DEC");
            okno.add(DecButt);
            HexButt = new JButton("HEX");
            okno.add(HexButt);
            GenerujButt = new JButton("Generuj");
            okno.add(GenerujButt);
    
    
            ButtonAction przycisk;
            przycisk = new ButtonAction();
    
            //sluchacze do przyciskow
            DecButt.addActionListener(przycisk);
            HexButt.addActionListener(przycisk);
            GenerujButt.addActionListener(przycisk);
    
    
            okno.setVisible(true);
    
        }//createGUI
    
        public static void main(String[] args) {
            System.out.println(Thread.currentThread().getName());
    
            javax.swing.SwingUtilities.invokeLater(new Runnable() {//klasa anonimowa - bo chcemy jej uzyc tylko raz
    
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                    Okno application = new Okno();
                        application.createGUI();
                }
            });//klasa anonimowa
    
        }
    
    
    }//class
    

    和ActionListeners +生成数字代码和HEX,DEC计算器

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.ObjectInputStream.GetField;
    import java.util.Random;
    
    import javax.swing.JLabel;
    
    
    
    public class ButtonAction extends Okno implements ActionListener{
    
        private int dec;
        private String hex;
    
        public void setDec(int dec) {
            this.dec = dec;
        }
        public int getDec() {
            return dec;
        }
    
        public void setHex(String hex) {
            this.hex = hex;
        }
        public String getHex() {
            return hex;
        }
    
        public int generateNum() {
    
            Random r = new Random();
            int number = r.nextInt(1000);
            return number;
        }
    
        public static int hex2decimal(String decimal) {
            String digits = "0123456789ABCDEF";
            decimal = decimal.toUpperCase();
            int val = 0;
            for (int i = 0; i < decimal.length(); i++) {
                char c = decimal.charAt(i);
                int d = digits.indexOf(c);
                val = 16*val + d;
            }
            return val;
        }
        // precondition:  d is a nonnegative integer
        public static String decimal2hex(int d) {
            String digits = "0123456789ABCDEF";
            if (d == 0) return "0";
            String hex = "";
            while (d > 0) {
                int digit = d % 16;
                hex = digits.charAt(digit) + hex;
                d = d / 16;
            }
            return hex;
        }
    
    
    
    
    
        @Override
        public void actionPerformed(ActionEvent arg0) {
            if(arg0.getActionCommand() == "DEC")
            {
                setDec(hex2decimal(getHex()));
                System.out.println(getDec());
            }
            else if(arg0.getActionCommand() == "HEX")
            {
                setHex(decimal2hex(getDec()));
                System.out.println(getHex());
            }
            else if(arg0.getActionCommand() == "Generuj")
            {
                setDec(generateNum());
                System.out.println(getDec());
                //getDecButt().setVisible(false);**********HERE is NullPointerExceprion
            }
    
        }//actionperformed
    
    }//class
    

    我在ActionPerformed中有nullpointerexception。有人可以告诉我为什么吗?

2 个答案:

答案 0 :(得分:0)

当您按下某个按钮时,在ActionListener中,使用buttonObject.setEnabled(false)

告诉按钮被禁用

您的ActionListener目前是如何设置的,解决问题的最简单方法是将JButton公开给其他软件包(但实际上并不是......推荐)

但是,您始终可以使用此类和匿名类以编程方式在GUI类中添加ActionListener(因为这样做可以让您保持JButton私有):

buttonName.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        buttonName.setEnabled(false);
        // Whatever other stuff you want to do.
    }
});

要处理显示,只需创建一个private方法,您可以在每个ActionListener匿名类中调用它。

答案 1 :(得分:0)

  当我的号码是十进制时,

DEC按钮应该隐藏,当我的号码是HEXADECIMAL时,HEX按钮应该隐藏。

我不确定我知道你为什么要打扰。相反,您可以将按钮添加到ButtonGroup,这样一次只能选择一个按钮,与JToggleButtonJRadioButton结合使用,您也可以获得视觉提示至于选择了哪个按钮

有关详细信息,请参阅How to Use the ButtonGroup ComponentHow to Use Buttons, Check Boxes, and Radio Buttons