Java JButton、JCheckBox和类似的交互程序在视觉上不会改变

Java JButton、JCheckBox和类似的交互程序在视觉上不会改变,java,swing,jbutton,jcheckbox,jslider,Java,Swing,Jbutton,Jcheckbox,Jslider,下面是一个简单的图形程序,它在屏幕上添加了一些星星 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 DrawStarMa

下面是一个简单的图形程序,它在屏幕上添加了一些星星

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;
    }
}
}
导入acm.graphics.*;
/**定义一个新的GObject类t:它显示为五角星。
*/
公共类GStar扩展了GPolygon{
/**创建一个新的GStar,该GStar以指定的
*水平宽度。
*@param width星星的宽度
*/
公共GStar(双幅){
双dx=宽度/2;
双dy=dx*GMath.tanDegrees(18);
双边缘=宽度/2-dy*GMath.tanDegrees(36);
addVertex(-dx,-dy);
内倾角=0;
对于(int i=0;i<5;i++){
添加极化(边缘、角度);
加极化(边缘,角度+72);
角度-=72;
}
}
}
该程序运行良好,每当用户在画布上单击鼠标时,都使用GStar类构造函数来创建星形。但是,有一个问题:“JCheckBox和JButton在视觉上永远不会改变!”。当我按下“清除”按钮时,画布变为空,但按钮似乎没有切换。类似地,程序同时绘制填充星和空星,但“填充”JCheckBox始终保持选中状态,不会更改。使用我在其他程序中使用的JSlider,问题变得更加严重。滑块始终保持在初始位置,即使它在某种意义上起作用:其值发生变化。我使用Eclipse,2011版本和最新的JRE库(v.7u6)。我在网上没有找到足够的信息。有什么问题?谢谢你的帮助!!acm软件包可以从这里下载。该框架旨在“向一年级计算机专业的学生教授Java,而不会让这些学生被其复杂性压垮”。为了实现这一点,它拦截所有鼠标和键盘事件,避免干扰正常的
JApplet
交互。请注意,其他示例显示了相同的行为。这是一种使用Swing API的替代方法

附录:在Java1.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 {
        ...  
    }
}


我正在想办法

add(fillCheckBox, NORTH); // SOUTH to NORTH
add(new JButton("Clear"), NORTH); // SOUTH to NORTH
为什么将位置
南部
切换到
北部
效果很好

更新:
以及
EAST
约束未正常工作。
可能有一些南部和东部约束的bug


输出:

请提供可编译代码(SSCCE)…好的,我已经添加了GStar源代码。你可以运行它@Harmeethinghit很遗憾,他们的标签不适合这些ACM类,因为在使用ACM API时,您可以使用Swing和AWT中使用的许多“传统智慧”并将其扔出窗口。那么,您建议对该程序进行哪些更改或导入?我是否应该像您给我的示例那样导入javax.swing库和java.awt图形@垃圾桶尽管如此,它应该与acm包一起使用,因为这些示例在“Java的艺术与科学”学术书籍中,作者使用了另一个与JTextField一起使用的示例,它在我的PC上也不起作用(我无法在框中键入)。我认为他不想和学生们玩。@KoTaskOnStantinidis:Java1.5似乎工作正常;我看不出一个简单的解决办法。我注意到一个
EAST
按钮在调整帧大小时会更新,这让我想起了1.6中引入的+1是的,似乎是这样,因为这个
acm
库太旧了,可能与
jdk7
不兼容……用Java 1.5编译似乎可以工作,如图所示。哦,我的天哪,它适用于
北部
西部
,但不适用于
南部
东部
。谢谢:)@harmeethingh