我想编写一个程序,检查选择哪个RadioButton(圆形,实心圆形或矩形)。然后用户单击画布字段上的某个位置。它应该识别用户点击的坐标,然后绘制在该位置选择的单选按钮。
可悲的是,它没有那样做。实际上我的代码甚至没有到达“ActionListener”。我已经检查了5次代码并进行了一些测试,但仍然无法弄明白。
希望你能帮忙
public class Optionen extends JFrame {
MeinCanvas drawspace = new MeinCanvas();
ButtonGroup btngrp= new ButtonGroup();
int xpos, ypos;
public Optionen(String titel) {
super(titel);
setLayout(new FlowLayout());
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3,1,20,20));
JRadioButton opt1 = new JRadioButton();
JRadioButton opt2 = new JRadioButton();
JRadioButton opt3 = new JRadioButton();
opt1.setActionCommand("Kreis"); //circle
opt1.setActionCommand("Scheibe"); // filled circle
opt1.setActionCommand("Rechteck"); //rectangle
opt1.setText("Kreis");
opt2.setText("Scheibe");
opt3.setText("Rechteck");
btngrp.add(opt1);
btngrp.add(opt2);
btngrp.add(opt3);
panel.add(opt1);
panel.add(opt2);
panel.add(opt3);
add(drawspace);
add(panel);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
Optionen fenster = new Optionen("Optionswindow");
fenster.pack();
fenster.setSize(450,500);
fenster.setResizable(true);
fenster.setVisible(true);
}
class MeinCanvas extends Canvas {
class MeinMausAdapter extends MouseAdapter {
public void mousPressed(MouseEvent e) {
xpos = e.getX();
ypos = e.getY();
JOptionPane.showInputDialog(this);
repaint();
}
}
public MeinCanvas() {
addMouseListener(new MeinMausAdapter());
setBackground(Color.black);
setForeground(Color.orange);
}
public void paint(Graphics g) {
ButtonModel btnmdl= m_formauswahl.getSelection();
String label = btnmdl.getActionCommand();
int w = (int) (Math.random()*300);
int h = (int) (Math.random()*300);
if (label.equals("Kreis"))
g.drawOval(xpos, ypos, w, w);
if (label.equals("Scheibe"))
g.fillOval(xpos, ypos, w, h);
if (label.equals("Rechteck"))
g.drawRect(xpos, ypos, w, h);
}
public Dimension getMinimumSize() {
return new Dimension(300,300);
}
public Dimension getPreferredSize() {
return getMinimumSize();
}
}
}
Eclipse告诉我代码很好,但每当我运行程序时,它会立即抛出异常。这是转储:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at kapitel10.Optionen$MeinCanvas.paint(Optionen.java:79)
at sun.awt.RepaintArea.paintComponent(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
答案 0 :(得分:4)
问题:
paintComponent
覆盖方法中绘制。repaint()
。修改强>
它也不是mousPressed
而是mousePressed
!!
您必须在所有重写方法之前使用@Override
注释以避免此类错误。
class MeinMausAdapter extends MouseAdapter {
@Override // this will cause a compiler error
public void mousPressed(MouseEvent e) { // until you fix this spelling!
ButtonModel btnmdl = btngrp.getSelection();
if (btnmdl == null) {
System.out.println("btn model is null");
return;
}
actionCmd = btnmdl.getActionCommand();
System.out.println(actionCmd);
xpos = e.getX();
ypos = e.getY();
// JOptionPane.showInputDialog(this);
repaint();
}
}
另外:您必须明确设置JRadioButton的actionCommands。您只对一个 JRadioButton执行此操作 - 请仔细查看您的代码。