Java Canvas类不绘制

时间:2014-09-06 01:06:23

标签: java canvas radio-button draw paint

我想编写一个程序,检查选择哪个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)

1 个答案:

答案 0 :(得分:4)

问题:

  1. 不要将AWT(Canvas)组件与Swing(JFrame)组件混合使用。坚持使用所有Swing组件。
  2. 而是按照Swing绘画教程中的描述 - 在JPanel的paintComponent覆盖方法中绘制。
  3. 别忘了在你的覆盖中调用super方法。
  4. 您的大多数代码甚至不应该在绘图方法中,而应在您的MouseListener代码中。您可能正在获得NPE,因为当GUI首次绘制时,JRadioButton尚未被选中。
  5. 在MouseListener中,获取ButtonModel,检查它是否为空,然后获取actionCommand,然后更改paintComponent方法使用的类字段的状态,以及然后拨打repaint()

  6. 修改

    它也不是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执行此操作 - 请仔细查看您的代码。