3

以下は、画面に星を追加する簡単なグラフィック プログラムです。

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

そして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;
    }
}
}

プログラムは問題なく動作し、ユーザーがキャンバス上でマウスをクリックするたびに、GStar クラス コンストラクターを使用してスターを作成します。ただし、「JCheckBox と JButton は視覚的に変化しない!」という問題があります。「Clear」JButton を押すと、キャンバスは空になりますが、ボタンがトグルしないようです。同様に、プログラムは塗りつぶされた星と空の星の両方を描画しますが、「塗りつぶされた」JCheckBox は常に選択されたままになり、変化しません。この問題は、私が他のプログラムで使用している JSlider ではさらに大きくなります。スライダーは、何らかの意味で機能している場合でも、常に初期位置にとどまります。値が変化します。私は 2011 年バージョンの Eclipse と最新の JRE ライブラリ (v.7u6 http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1637588.html)。インターネットで十分な情報が見つかりませんでした。何が問題ですか?ご協力ありがとうございました!!acm パッケージはhttp://jtf.acm.org/acm.jarからダウンロードできます。

4

2 に答える 2

5

ACM Java Task Forceフレームワークは、「Javaを1年生のコンピューティング学生に、その複雑さに圧倒されることなく教える」ように設計されています。これを実現するために、通常の対話を妨げることのない方法で、すべてのマウスとキーボードのイベントをインターセプトします。他の例もこれと同じ動作を示すことに注意してください。このは、SwingAPIを使用した代替手段です。JApplet

補遺:Java 1.5でコンパイルすると、期待される機能が復元されるようです。

ここに画像の説明を入力してください

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 {
        ...  
    }
}
于 2012-08-26T14:16:06.257 に答える
2

私はこれを理解しています...。

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

どうしてポジションをからSOUTHに切り替えるのがNORTHうまくいくのか..

更新:
制約 だけEASTでなく、正しく機能していません。
いくつかのバグSOUTHEAST制約があるかもしれません。

出力:

于 2012-08-26T16:16:52.757 に答える