JButton, JCheckBox и подобные интеракторы не изменяются визуально
Вот простая графическая программа, которая добавляет несколько звездочек на экран.
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 никогда не меняются визуально!". Когда я нажимаю кнопку "Очистить", холст становится пустым, но кнопка, кажется, не переключается. Точно так же программа рисует заполненные и пустые звезды, но "заполненный" JCheckBox остается всегда выбранным, он не изменяется. Проблема становится еще больше с JSlider, который я использую в других программах. Ползунок всегда остается в исходном положении, даже если он работает в некотором смысле: его значение изменяется. Я использую Eclipse, версию 2011 года и последнюю библиотеку JRE (v.7u6 http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1637588.html). Я не нашел достаточно информации в Интернете. В чем проблема? Спасибо за помощь!! Пакет acm можно скачать здесь http://jtf.acm.org/acm.jar
2 ответа
Инфраструктура ACM Java Task Force предназначена для "обучения Java первокурсникам, изучающим компьютерные технологии, без лишних сложностей". Чтобы добиться этого, он перехватывает все события мыши и клавиатуры таким образом, чтобы не мешать нормальному JApplet
взаимодействие. Обратите внимание, что другие примеры демонстрируют такое же поведение. Этот пример является альтернативой с использованием Swing API.
Приложение: Компиляция под 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 {
...
}
}
Я выясняю это....
add(fillCheckBox, NORTH); // SOUTH to NORTH
add(new JButton("Clear"), NORTH); // SOUTH to NORTH
почему происходит переключение позиции с SOUTH
в NORTH
работает отлично..
ОБНОВИТЬ:
Так же как EAST
ограничение не работает должным образом.
Может быть, есть какая-то ошибка с SOUTH
а также EAST
ограничения.
ВЫХОД: