2016-05-17 4 views
1

aufgerufen habe Hier habe ich ein Problem Ich möchte, dass Sie mir helfen zu lösen. Vielen Dank an alle, die dies wünschen.Grafikobjekt sind nicht sichtbar, wenn ich Repaint-Methode

Ich habe Objekte, die von der JComponent Klasse erben, zu der ich eine MouseListener hinzugefügt habe.

Ich habe ein Gitter, das ein Panel erbt.

Ich möchte die Objekte einzeln im Raster hinzufügen, so dass in meinem Raster mindestens 2 Formen ähnlich oder unterschiedlich sind. Während des Hinzufügens möchte ich, dass dies an einer bestimmten Position geschieht (die, auf die wir gerade geklickt haben), während die Objekte des Typs JComponents einander nicht übereinander gestapelt werden oder dass ihr Schnittpunkt etwas anderes als den leeren Satz oder den geraden Teil ergibt (a Segment). Um seine Ärgernisse zu vermeiden, denke ich, dass, wenn Sie nach dem Klicken in/auf dem Gitter hinzufügen, überprüfen, ob der Punkt nicht bereits in einem Objekt JComponent erbt und wenn die Anzahl der Kästchen ist genug. Aber es funktioniert immer noch nicht. Auch wenn das hinzuzufügende Objekt nicht im Raster erscheint (die Implementierung ist in der GrilleIHM#mouseClicked Methode).

Ich habe versucht, das Verhalten von Objekten auf Klick zu zentralisieren, indem eine Klasse nur für die statt mit dem gleichen Stück Code in all meinen Formen (I 8), aber ohne Erfolg zu schaffen. also habe ich diese Idee aufgegeben.

Als Null in Java habe ich so weit durch die Tutorials und Foren fortgeschritten. Aber nach zwanzig Tagen komme ich gar nicht weiter.

Ich weiß, dass ich auf einmal zu viel verlangen, aber jetzt nicht mehr ich eine Lösung finden.

Vielen Dank für Ihre Hilfe.

, dass mein Code ist:

public class GrilleIHM extends JFrame implements MouseListener { 
    private static final long serialVersionUID = 5592120196313024461L; 

    private String typeF; 
    private Forme22 f1 = new Forme22(20,20); 
    private Forme2 f2 = new Forme2(20,20); 
    private Forme3 f3 = new Forme3(20,20); 
    private Forme3_1 f4 = new Forme3_1(20,20); 
    private Forme4 f5 = new Forme4(20,20); 
    private Forme5 f6 = new Forme5(20,20); 
    private Forme6 f7 = new Forme6(20,20); 
    private Former f8 = new Former(20,20); 

    private int n; 
    private int m; 
    private int o; 
    private int p; 
    private boolean startmyGame = false; 
    private boolean bpause = false; 
    private boolean breprendre = false; 

    private JButton startGame = new JButton("Commencer"); 
    private JButton pause = new JButton("Pause"); 
    private JButton reprendre = new JButton("Redémarrer"); 
    private Font maFont = new Font("Arial", Font.CENTER_BASELINE, 15); 
    private FlowLayout experimentLayout = new FlowLayout(); 
    private JPanel panelinfo = new JPanel(); 
    private Grille magrille ; 

    private boolean clickgrill; 
    private int nbCaseVide; 
    private int nbCGrille; 

    public GrilleIHM(int nbCX, int nbCY, int nbF, int nbCMax) { 
     super(); 
     this.m = nbCY; 
     this.n = nbCX; 
     this.o = nbF; 
     this.p = nbCMax; 
     createAndShowGUI();  
    } 

    private void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("Grille IHM ou Agencement"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     initComponents(frame.getContentPane()); 
     frame.addMouseListener(this); 
     frame.pack(); 
     frame.setVisible(true);    
    } 

    private void initComponents(Container pane) { 
     magrille = new Grille(this.n, this.m); 
     magrille.addMouseListener(this);  

     //les menu horizotal 
     panelinfo.setPreferredSize(new Dimension(400,400)); 

     // menu vertical 
     JPanel panel = new JPanel(); 
     BoxLayout box = new BoxLayout(panel, BoxLayout.Y_AXIS); 
     // pane.addMouseListener(new MyMouseOneJComponents()); 
     // box. 
     panel.setLayout(box); 
     panel.setPreferredSize(new Dimension(120, 20)); 
     panel.setAlignmentX(20); 
     startGame.setMaximumSize(
      new Dimension(Integer.MAX_VALUE, 
          startGame.getMinimumSize().height)); 
     pause.setMaximumSize(
      new Dimension(Integer.MAX_VALUE, 
          pause.getMinimumSize().height)); 
     reprendre.setMaximumSize(
      new Dimension(Integer.MAX_VALUE, 
          reprendre.getMinimumSize().height)); 
     reprendre.setFont(maFont); 
     pause.setFont(maFont); 
     startGame.setFont(maFont); 

     startGame.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       startGameActionPerformed(evt); 
      } 
     }); 

     reprendre.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       reprendreGameActionPerformed(evt); 
      } 
     }); 

     pause.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       pauseGameActionPerformed(evt); 
      } 
     }); 

     //reprendre.set 
     panel.add(startGame); 
     panel.add(reprendre); 
     panel.add(pause); 

     final JPanel compsToExperiment = new JPanel(); 
     compsToExperiment.setLayout(experimentLayout); 
     experimentLayout.setAlignment(FlowLayout.TRAILING); 

     switch (this.p) { 
     case 2: 
      pane.setComponentOrientation(java.awt.ComponentOrientation.RIGHT_TO_LEFT); 
      f2.setPreferredSize(new Dimension(120, 120)); 

      pane.add(panel, BorderLayout.EAST); 
      pane.add(f2, BorderLayout.NORTH); 
      magrille.setPreferredSize(
       new Dimension(20*magrille.getNbCaseX(), 
           20*magrille.getNbCaseY())); 

      pane.add(magrille, BorderLayout.CENTER); 
      pane.add(panelinfo, BorderLayout.WEST); 
      // p; 
      f2.validate(); 
      f2.repaint(); 
      panel.validate(); 
      panel.repaint(); 
      magrille.validate(); 
      magrille.repaint(); 
      break; 

     case 3: 
      compsToExperiment.add(f2); 
      compsToExperiment.add(f3); 
      compsToExperiment.add(f4); 

      f2.setPreferredSize(new Dimension(120, 120)); 
      f3.setPreferredSize(new Dimension(120, 120)); 
      f4.setPreferredSize(new Dimension(120, 120)); 

      pane.add(panel, BorderLayout.EAST); 
      pane.add(compsToExperiment, BorderLayout.NORTH); 

      magrille.setPreferredSize(
       new Dimension(20*magrille.getNbCaseX(), 
           20*magrille.getNbCaseY())); 
      pane.add(magrille, BorderLayout.CENTER); 
      pane.add(panelinfo, BorderLayout.WEST); 
      // p; 
      f2.validate(); 
      f2.repaint(); 
      f3.validate(); 
      f3.repaint(); 
      f4.validate(); 
      f4.repaint(); 
      panel.validate(); 
      panel.repaint(); 
      magrille.validate(); 
      magrille.repaint();          
      break; 

     case 4: 
     case 5: 
     case 6: 
      compsToExperiment.add(f2); 
      compsToExperiment.add(f3); 
      compsToExperiment.add(f4); 
      compsToExperiment.add(f1); 
      compsToExperiment.add(f5); 
      f1.setPreferredSize(new Dimension(120, 120)); 
      f2.setPreferredSize(new Dimension(120, 120)); 
      f3.setPreferredSize(new Dimension(120, 120)); 
      f4.setPreferredSize(new Dimension(120, 120)); 
      f5.setPreferredSize(new Dimension(120, 120)); 
      pane.add(panel, BorderLayout.EAST); 
      pane.add(compsToExperiment, BorderLayout.NORTH); 

      magrille.setPreferredSize(
       new Dimension(20*magrille.getNbCaseX(), 
           20*magrille.getNbCaseY())); 
      pane.add(magrille, BorderLayout.CENTER); 
      pane.add(panelinfo, BorderLayout.WEST); 
      // p; 
      f2.validate(); 
      f2.repaint(); 
      f3.validate(); 
      f3.repaint(); 
      f4.validate(); 
      f4.repaint(); 
      f1.validate(); 
      f1.repaint(); 
      f5.validate(); 
      f5.repaint(); 
      panel.validate(); 
      panel.repaint(); 
      magrille.validate(); 
      magrille.repaint();     
      break; 

     case 7: 
      compsToExperiment.add(f2); 
      compsToExperiment.add(f3); 
      compsToExperiment.add(f4); 
      compsToExperiment.add(f1); 
      compsToExperiment.add(f5); 
      compsToExperiment.add(f8); 
      f1.setPreferredSize(new Dimension(120, 120)); 
      f2.setPreferredSize(new Dimension(120, 120)); 
      f3.setPreferredSize(new Dimension(120, 120)); 
      f4.setPreferredSize(new Dimension(120, 120)); 
      f5.setPreferredSize(new Dimension(120, 120)); 
      f8.setPreferredSize(new Dimension(120, 120)); 
      pane.add(panel, BorderLayout.EAST); 
      pane.add(compsToExperiment, BorderLayout.NORTH); 

      magrille.setPreferredSize(
       new Dimension(20*magrille.getNbCaseX(), 
           20*magrille.getNbCaseY())); 
      pane.add(magrille, BorderLayout.CENTER); 
      pane.add(panelinfo, BorderLayout.WEST); 
      // p; 
      f2.validate(); 
      f2.repaint(); 
      f3.validate(); 
      f3.repaint(); 
      f4.validate(); 
      f4.repaint(); 
      f1.validate(); 
      f1.repaint(); 
      f5.validate(); 
      f5.repaint(); 
      f8.validate(); 
      f8.repaint(); 
      panel.validate(); 
      panel.repaint(); 
      magrille.validate(); 
      magrille.repaint(); 
      break; 

     default: 
      compsToExperiment.add(f2); 
      compsToExperiment.add(f3); 
      compsToExperiment.add(f4); 
      compsToExperiment.add(f1); 
      compsToExperiment.add(f5); 
      compsToExperiment.add(f8); 
      compsToExperiment.add(f6); 
      compsToExperiment.add(f7); 
      f1.setPreferredSize(new Dimension(120, 120)); 
      f2.setPreferredSize(new Dimension(120, 120)); 
      f3.setPreferredSize(new Dimension(120, 120)); 
      f4.setPreferredSize(new Dimension(120, 120)); 
      f5.setPreferredSize(new Dimension(120, 120)); 
      f8.setPreferredSize(new Dimension(120, 120)); 
      f6.setPreferredSize(new Dimension(120, 120)); 
      f7.setPreferredSize(new Dimension(120, 120)); 
      pane.add(panel, BorderLayout.EAST); 
      pane.add(compsToExperiment, BorderLayout.NORTH); 

      magrille.setPreferredSize(
       new Dimension(20*magrille.getNbCaseX(), 
           20*magrille.getNbCaseY())); 
      pane.add(magrille, BorderLayout.CENTER); 
      pane.add(panelinfo, BorderLayout.WEST); 
      // p; 
      f2.validate(); 
      f2.repaint(); 
      f3.validate(); 
      f3.repaint(); 
      f4.validate(); 
      f4.repaint(); 
      f1.validate(); 
      f1.repaint(); 
      f5.validate(); 
      f5.repaint(); 
      f8.validate(); 
      f8.repaint(); 
      f6.validate(); 
      f6.repaint(); 
      f7.validate(); 
      f7.repaint(); 
      panel.validate(); 
      panel.repaint(); 
      magrille.validate(); 
      magrille.repaint(); 
      break; 
     } 

      //les menu horizontal 
    } 

    public int getO() { 
     return o; 
    } 

    public void setO(int o) { 
     this.o = o; 
    } 

    @Override 
    public void mouseClicked(MouseEvent evt) { 
     magrille.setLayout(null); 
     int valX=evt.getX(); 
     int valY=evt.getY(); 
     System.out.println(valX); 
     System.out.println(valY); 
     JComponent f11; 

     if (f1.getTypeF()!=null && getO()>=0) { 
      typeF=f1.getTypeF(); 
      f1.setTypeF(null); 

      if (f1.isInForme(valX, valY)==false 
      && f2.isInForme(valX, valY)==false 
      && f3.isInForme(valX, valY)==false 
      && f4.isInForme(valX, valY)==false 
      && f5.isInForme(valX, valY)==false 
      && f6.isInForme(valX, valY)==false 
      && f7.isInForme(valX, valY)== false 
      && f8.isInForme(valX, valY)==false) { 
       if (magrille.getNbCGrille()> magrille.getNbCaseOccupe()) { 
        System.out.println(" nbVideSuffissant");     
        f11= new Forme2((int)valX,(int)valY); 
        System.out.println(" ab grille = "+ valX); 
        System.out.println("ord grille = " + valY); 
        System.out.println(" ord création objet"); 
        // f11.paint(); 
        //f11.validate();  
        magrille.add(f11); 
        f11.setBounds(valX, valY, 40, 40); 
        f11.validate(); 
        f11.repaint(); 
        magrille.revalidate(); 
        magrille.repaint(); 
        this.validate(); 
        this.repaint(); 
        //validate(); 
        //magrille.notify(); 
        //repaint(); 
        //revalidate(); 
        magrille.setNbCaseOccupe(f1.getNbCase()); 
        // magrille.repaint(); 
        System.out.println(magrille.getNbCaseOccupe()); 
        //repaint(); 
        setO(getO()- 1); 
        System.out.println(getO()); 
       } 
      } 
      System.out.println("click ok"); 
      ///evt.getComponent(). 
     } 
    } 

    public int getNbCGrille() { 
     return this.n* this.m; 
    } 

    public void setNbCGrille(int nbCasX, int nbCasY) { 
     this.nbCGrille = nbCasX*nbCasY; 
    } 

    public int getNbCaseVide() { 
     return nbCaseVide; 
    } 

    public void setNbCaseVide(int nbCaseVide) { 
     this.nbCaseVide =getNbCGrille() - nbCaseVide; 
    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseExited(MouseEvent arg0) { 
     // TODO Auto-generated method stub 
    } 

    // on regarde quelle forme a été cliqué puis on initialise sa valeur cliqué a true; 
    // (we see what form was clicked on and we initialize his clicked value to true) 
    @Override 
    public void mousePressed(MouseEvent evt) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stu 
    } 

    private void pauseGameActionPerformed(ActionEvent evt) { 
     // TODO Auto-generated method stub 
     bpause=true; 
    } 

    private void reprendreGameActionPerformed(ActionEvent evt) { 
     // TODO Auto-generated method stub 
    } 

    private void startGameActionPerformed(ActionEvent evt) { 
     // TODO Auto-generated method stub 
     startmyGame=true; 
     if (startmyGame==true) { 
      magrille.addMouseListener(this); 
     } 
     bpause=false; 
     breprendre=false; 
    } 
} 

Klasse Forme22:

public class Forme22 extends JComponent implements MouseListener { 

    private static final long serialVersionUID = -8557188538997741713L; 
    private static final int taillC = 20; 
    // x et y = coordonée du point cliqué 

    private int abs; 
    private int ord; 
    private double tab[][]; 
    private Color col; 
    private int nbCase=4; 
    private String typeF; 
    private boolean click=false; 

    public Forme22(int abs, int ord) { 
     super(); 
     this.abs = abs; 
     this.ord = ord; 
     this.col=Color.gray; 
     tab= new double [2][2]; 
     addMouseListener((MouseListener) this); 
    } 

    public void paint (Graphics gr){ 
     Graphics2D g= (Graphics2D)gr; 
     for (int i = 0; i < this.tab[0].length; i++) { 
      for (int k=0; k <this.tab.length; k++) { 
       g.setColor(col); 
       Rectangle2D.Double rect = 
        new Rectangle2D.Double(this.abs+i*taillC, 
              this.ord+k*taillC, 
              taillC, 
              taillC); 
       g.fill(rect); 
       g.setColor(Color.black); 
       g.draw(rect); 
      } 
     } 
    } 

    public boolean isInForme(int valX, int valY){ 
     return ((this.abs <= (int)valX) 
       && (this.abs+2*taillC >= (int)valX) 
       && (this.ord <= (int)valY) 
       && (this.ord+2*taillC >= (int)valY)); 
    } 

    public String getCol() { 
     return "gray"; 
    } 
    public void setCol(Color col) { 
     this.col = col; 
    } 

    public int getNbCase() { 
     return nbCase; 
    } 

    public void setNbCase(int nbCase) { 
     this.nbCase = nbCase; 
    } 

    public boolean isClick() { 
     return click; 
    } 

    public void setClick(boolean click) { 
     this.click = click; 
    } 

    public int getAbs() { 
     return abs; 
    } 

    public void setAbs(int abs) { 
     this.abs = abs; 
    } 

    public int getOrd() { 
     return ord; 
    } 

    public void setOrd(int ord) { 
     this.ord = ord; 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    // ajout du mouselistener dans les formes au survol des JComposants 
    // (Adding of mouselistener in forms on hover on JComponants) 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     //recuperation coordonnée endroits cliquée 
     int x=e.getX(); 
     int y =e.getY(); 
     // memeorisation des nouveaux coordonées pour les récupéré depuis la grille en créant un point; 
     // (saving new coordinates for gather them from the grid during creating a point) 
     Point p=new Point(x, y); 
     setTypeF("forme22"); 
     setClick(true); 
    } 

    public String getTypeF() { 
     return typeF; 
    } 

    public void setTypeF(String typeF) { 
     this.typeF = typeF; 
    } 
} 
+0

* Null ist in Java, ich habe bisher durch die voran Tutorials und Foren. Aber nach 20 Tagen komme ich gar nicht weiter. * Finde einen Tutor und sei bereit, 2000 Tage Java zu lernen und zu programmieren. –

Antwort

1

Sie sind Code sehr schwer zu Namen zu lesen, versuchen Sie Attribute mit einer bedeutenden Weise um, was diese zu sehen Variable ist oder was soll es tun, nur seinen Namen zu lesen.

Ich denke, Ihr Problem ist irgendwo unter diesen Problemen versteckt. Versuchen Sie, Ihren Code umzuformatieren, und ich denke, der Fehler wird verschwinden.


Ihre Klasse erweitert JFrame. Sie müssen also keine new JFrame() machen!

Die Linie super() in Ihrem Konstruktor ist genau das gleiche wie der new JFrame() Anruf (so dass Sie in Ihrem Code haben super("Grille IHM ou Agencement"); zu tun)

Das bedeutet, dass Sie this statt frame verwenden.


Ihre ist zu groß.Brich es in einige Methoden ein; zum Beispiel, wie etwas zu erhalten:

switch(status) { 
    case 0: 
     if_status_0(what_the_method_need); 
     break; 
    case 1: 
     if_status_1(what_the_method_need); 
     break; 
    default: 
     if_default(what_the_method_need); 
     //break; << you can avoid the break of default statement in a switch case 
} 

können Sie auch Ihren Code unter Verwendung von Methoden für Code mehrfach verwendet, zum Beispiel Refactoring:

@Override    // exceptionnally 
public void repaint() // for this method you can use this name 

// but for others use like this with private personalized method 
private void mySubMethodName() { 
    f2.validate(); 
    f2.repaint(); 
    f3.validate(); 
    f3.repaint(); 
    f4.validate(); 
    f4.repaint(); 
    f1.validate(); 
    f1.repaint(); 
    f5.validate(); 
    f5.repaint(); 
    panel.validate(); 
    panel.repaint(); 
    magrille.validate(); 
    magrille.repaint(); 
} 
Verwandte Themen