我需要写一个简单的程序:
三个按钮 GEN - 生成一个数字 HEX - 将我的数字计算为十六进制数 DEC - 将我的数字计算为十进制数
的JLabel 它显示数字。
当我生成例如第三个数字时,当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。有人可以告诉我为什么吗?
答案 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
,这样一次只能选择一个按钮,与JToggleButton
或JRadioButton
结合使用,您也可以获得视觉提示至于选择了哪个按钮
有关详细信息,请参阅How to Use the ButtonGroup Component和How to Use Buttons, Check Boxes, and Radio Buttons