La classe Java Canvas ne peint pas


Je voulais écrire un programme, qui vérifie quel RadioButton est sélectionné(cercle, cercle rempli ou rectangle). Ensuite, l'utilisateur clique quelque part sur le champ canvas. Il doit reconnaître les coordonnées où l'utilisateur a cliqué, puis dessiner tout ce qui est sélectionné comme bouton radio à cette position.

Malheureusement, il ne le fait pas. En fait, mon code n'atteint même pas le "ActionListener". J'ai déjà vérifié le code comme 5 fois et j'ai fait quelques tests mais je ne pouvais toujours pas le comprendre hors.

J'espère que vous pouvez aider

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 me dit que le code est correct, mais chaque fois que j'exécute le programme, il lève instantanément des exceptions. Voici le vidage:

    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)
Author: Cappuccino90, 2014-09-06

1 answers

Problèmes:

  1. Ne mélangez pas les composants AWT (Canvas) avec les composants Swing (JFrame). Coller avec tous les composants Swing.
  2. Dessinez plutôt comme décrit dans les tutoriels de peinture Swing in dans la méthode paintComponent override d'un JPanel.
  3. N'oubliez pas d'appeler la super méthode dans votre override.
  4. La plupart de votre code ne devrait même pas être dans une méthode de peinture mais plutôt dans votre code MouseListener. Vous obtenez peut être le NPE car le JRadioButton n'a pas encore été sélectionné lorsque l'interface graphique se dessine pour la première fois.
  5. Dans votre MouseListener, obtenez le ButtonModel, vérifiez qu'il n'est pas null, puis obtenez actionCommand, puis modifiez l'état d'un champ de classe utilisé par la méthode paintComponent, puis appelez repaint().

Modifier

Ce n'est pas non plus mousPressed mais mousePressed!! Vous devez utiliser l'annotation @Override avant toutes les méthodes surchargées pour éviter ce genre d'erreur.

  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();
     }
  }

Aussi: vous devez définir votre Jradiobutton's Actioncommand explicitement. Vous ne faites cela que pour un JRadioButton look regardez attentivement votre code.

 4
Author: Hovercraft Full Of Eels, 2014-09-06 01:27:34