2012-08-26 2 views
3

Voici un simple programme graphique qui ajoute quelques étoiles à l'écran.JButton, JCheckBox et interacteurs similaires ne changent pas visuellement

import acm.graphics.*; 
import acm.program.*; 
import java.awt.event.*; 
import javax.swing.*; 

/** 
* This program creates a five-pointed star every time the 
* user clicks the mouse on the canvas. 
*/ 

public class DrawStarMap1 extends GraphicsProgram { 

    public void init() { 
     /* Initializes the mouse listeners */ 
     addMouseListeners(); 

     /* The check box starts out in the "on" position */ 
     fillCheckBox = new JCheckBox("Filled"); 
     fillCheckBox.setSelected(true); 
     add(fillCheckBox, SOUTH); 

     /* Clears the screen with a button */ 
     add(new JButton("Clear"), SOUTH); 
     addActionListeners(); 
    } 

    /* Called whenever the user clicks the mouse.*/ 
    public void mouseClicked(MouseEvent e) { 
     GStar star = new GStar(STAR_SIZE); 
     star.setFilled(fillCheckBox.isSelected()); 
     add (star, e.getX(), e.getY()); 
    } 

    /* Removes all the graphical objects from the canvas */ 
    public void actionPerformed(ActionEvent e){ 
     if(e.getActionCommand().equals("Clear")) removeAll(); 
    } 

    /* Private constants */ 
    private static final double STAR_SIZE = 20; 

    private JCheckBox fillCheckBox; 
} 

Et la classe GStar:

import acm.graphics.*; 

/** Defines a new GObject class t:hat appears as a five-pointed star. 
*/ 
public class GStar extends GPolygon { 

    /** Creates a new GStar centered at the origin with the specified 
    * horizontal width. 
    * @param width The width of the star 
    */ 
public GStar(double width) { 
    double dx = width/2; 
    double dy = dx * GMath.tanDegrees(18); 
    double edge = width/2 - dy * GMath.tanDegrees(36); 
    addVertex(-dx, -dy); 
    int angle = 0; 
    for (int i = 0; i < 5; i++) { 
     addPolarEdge(edge, angle); 
     addPolarEdge(edge, angle + 72); 
     angle -= 72; 
    } 
} 
} 

Le programme fonctionne très bien et utilise un constructeur de classe GStar pour créer une étoile à chaque fois que l'utilisateur clique sur la souris sur la toile. Mais, il y a un problème: "JCheckBox et JButton ne changent jamais visuellement!". Quand j'appuie sur le bouton JButton "Effacer", la toile devient vide mais le bouton ne semble pas basculer. De même le programme dessine à la fois des étoiles remplies et vides mais le JCheckBox "Filled" reste toujours sélectionné, il ne change pas. Le problème devient encore plus grand avec le JSlider que j'utilise dans d'autres programmes. Le curseur reste toujours à la position initiale, même si cela fonctionne dans un certain sens: sa valeur change. J'utilise Eclipse, version 2011 et la dernière bibliothèque JRE (v.7u6 http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1637588.html). Je n'ai pas trouvé suffisamment d'informations sur Internet. Quel est le problème? Merci de votre aide!! Le paquet acm peut être téléchargé ici http://jtf.acm.org/acm.jar

+0

S'il vous plaît fournir le code ** compilable ** (SSCCE) .. –

+0

I'have ok ajouté le code source GStar. vous pouvez l'exécuter. @HarmeetSingh – mgus

Répondre

5

Le framework ACM Java Task Force est conçu pour "enseigner Java aux étudiants de première année en informatique sans que ces étudiants ne soient dépassés par sa complexité". Pour ce faire, il intercepte tous les événements de souris et de clavier d'une manière que empêche d'interférer avec l'interaction JApplet normale. Notez que les autres exemples présentent ce même comportement. Cette example est une alternative utilisant l'API Swing.

Addendum: La compilation sous Java 1.5 semble restaurer la fonctionnalité attendue.

enter image description here

import acm.graphics.GMath; 
import acm.graphics.GPolygon; 
import acm.program.*; 
import java.awt.event.*; 
import javax.swing.*; 

/** 
* This program creates a five-pointed star every time the user clicks the mouse 
* on the canvas. 
*/ 
public class DrawStarMap extends GraphicsProgram { 

    public void init() { 
     addMouseListeners(); 
     add(new JButton("ClearN"), NORTH); 
     add(new JButton("ClearW"), WEST); 
     add(new JButton("ClearE"), EAST); 
     add(new JButton("ClearS"), SOUTH); 
     addActionListeners(); 
    } 

    /* 
    * Called whenever the user clicks the mouse. 
    */ 
    public void mouseClicked(MouseEvent e) { 
     GStar star = new GStar(STAR_SIZE); 
     star.setFilled(true); 
     add(star, e.getX(), e.getY()); 
    } 

    /* 
    * Removes all the graphical objects from the canvas 
    */ 
    public void actionPerformed(ActionEvent e) { 
     System.out.println(e.getActionCommand()); 
     if (e.getActionCommand().startsWith("Clear")) { 
      removeAll(); 
     } 
    } 

    /* 
    * Private constants 
    */ 
    private static final double STAR_SIZE = 20; 

    private static class GStar extends GPolygon { 
     ... 
    } 
} 
+0

Voir aussi [* Play Cadre *] (http://en.wikipedia.org/wiki/Play_Framework). – trashgod

+0

Il est dommage que leur étiquette ne soit pas appropriée pour ces classes ACM, car vous pouvez utiliser une grande partie de la «sagesse conventionnelle» utilisée dans Swing et AWT et la jeter par la fenêtre lorsque vous utilisez l'API ACM. –

+0

Alors, quels changements ou importations suggérez-vous pour ce programme? Dois-je importer la bibliothèque javax.swing avec des graphiques java.awt comme l'exemple que vous m'avez donné? @trashgod – mgus

2

Je ceci .... Figuring

add(fillCheckBox, NORTH); // SOUTH to NORTH 
add(new JButton("Clear"), NORTH); // SOUTH to NORTH 

comment se fait passer la SOUTH-NORTH position de fonctionne très bien ..

MISE À JOUR:
De même que la contrainte EAST ne fonctionne pas correctement.
Il peut y avoir un bug avec les contraintes SOUTH et EAST.

SORTIE:

+0

+1 Je vois le même résultat, mais on ne sait pas pourquoi. – trashgod

+0

La compilation avec Java 1.5 semble fonctionner, comme indiqué [ici] (http://stackoverflow.com/a/12130829/230513). – trashgod

+0

Oh mon Dieu, ça marche à la fois pour 'NORTH' et' WEST' mais pas pour 'SOUTH' et' EAST'. Merci :) @HarmeetSingh – mgus

Questions connexes