为所有现有子线程更改相同的变量
Changing the same variable for all existing subthreads
如果之前有人问过这个问题,请提前致歉。我真的试图找到对我有帮助的东西。遗憾的是我没有运气。
这是我的情况:
我有一个带有按钮和滑块的框架 class。我有一个线程 class。使用框架 class 中的按钮,我创建了线程 class 的实例。线程的一个实例 class 代表一张图片。所有的子线程(图片)都将显示在同一帧中并以一定的间隔移动。
这是我的问题:
滑块控制运动画面的间隔。所以他们移动得更快或更慢。所有图片都应该同时变快或变慢。不幸的是,只有第一个创建的线程会受到滑块的影响。同样的问题是我的 ComponentAdapter 有他的 componentResized 功能。所有线程(或图片)都应该相对于帧大小同时变大或变小。
在这里,我将尝试大致向您展示我是如何做的:
帧class:
//The actionPerformed for the button that keeps creating threads
//Every thread is a picture (ant in this case) that
// moves through the same field of buttons
public void actionPerformed(ActionEvent e){
a = new AmeiseThread(this);
a.start();
}
// The slider in the frame.When it changes, also the picture movement speed changes
sliderKind.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider) e.getSource();
if (!source.getValueIsAdjusting()) {
int speed = source.getValue();
a.sleeptime = 1000 / speed;
}
}
});
// Whenever the Frame gets resized, it will change the Pictures
// on its buttons relatively to its new size
class MyComponentAdapter extends ComponentAdapter {
public void componentResized(ComponentEvent e) {
xScale = jbArray.get(1).getSize().width;
yScale = jbArray.get(1).getSize().height;
a.ameisen.clear();
a.ameisen.add(new ImageIcon(new ImageIcon("ameise.gif").getImage()
.getScaledInstance(xScale, yScale, Image.SCALE_SMOOTH)));
a.ameisen.add(new ImageIcon(new ImageIcon("ameise90.gif").getImage()
.getScaledInstance(xScale, yScale, Image.SCALE_SMOOTH)));
a.ameisen.add(new ImageIcon(new ImageIcon("ameise180.gif").getImage()
.getScaledInstance(xScale, yScale, Image.SCALE_SMOOTH)));
a.ameisen.add(new ImageIcon(new ImageIcon("ameise270.gif").getImage()
.getScaledInstance(xScale, yScale, Image.SCALE_SMOOTH)));
}
}
我想不出在我的线程 class 中写的任何内容可能会引起您的兴趣。我认为问题出在我已经 posted 的代码中的某处。但是,如果您确实需要更多信息,请发表评论,我会立即 post 更多信息。
再次抱歉,如果该问题已经存在。我觉得它确实如此,因为它听起来很简单。虽然我真的试图找到类似的问题,但我没有运气。
保存您创建的所有线程
threadList.add(a);
当滑块改变时迭代它
for (AmeiseThread a: threadList)
if (!source.getValueIsAdjusting()) {
int speed = source.getValue();
a.sleeptime = 1000 / speed;
}
如果之前有人问过这个问题,请提前致歉。我真的试图找到对我有帮助的东西。遗憾的是我没有运气。
这是我的情况:
我有一个带有按钮和滑块的框架 class。我有一个线程 class。使用框架 class 中的按钮,我创建了线程 class 的实例。线程的一个实例 class 代表一张图片。所有的子线程(图片)都将显示在同一帧中并以一定的间隔移动。
这是我的问题:
滑块控制运动画面的间隔。所以他们移动得更快或更慢。所有图片都应该同时变快或变慢。不幸的是,只有第一个创建的线程会受到滑块的影响。同样的问题是我的 ComponentAdapter 有他的 componentResized 功能。所有线程(或图片)都应该相对于帧大小同时变大或变小。
在这里,我将尝试大致向您展示我是如何做的:
帧class:
//The actionPerformed for the button that keeps creating threads
//Every thread is a picture (ant in this case) that
// moves through the same field of buttons
public void actionPerformed(ActionEvent e){
a = new AmeiseThread(this);
a.start();
}
// The slider in the frame.When it changes, also the picture movement speed changes
sliderKind.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider) e.getSource();
if (!source.getValueIsAdjusting()) {
int speed = source.getValue();
a.sleeptime = 1000 / speed;
}
}
});
// Whenever the Frame gets resized, it will change the Pictures
// on its buttons relatively to its new size
class MyComponentAdapter extends ComponentAdapter {
public void componentResized(ComponentEvent e) {
xScale = jbArray.get(1).getSize().width;
yScale = jbArray.get(1).getSize().height;
a.ameisen.clear();
a.ameisen.add(new ImageIcon(new ImageIcon("ameise.gif").getImage()
.getScaledInstance(xScale, yScale, Image.SCALE_SMOOTH)));
a.ameisen.add(new ImageIcon(new ImageIcon("ameise90.gif").getImage()
.getScaledInstance(xScale, yScale, Image.SCALE_SMOOTH)));
a.ameisen.add(new ImageIcon(new ImageIcon("ameise180.gif").getImage()
.getScaledInstance(xScale, yScale, Image.SCALE_SMOOTH)));
a.ameisen.add(new ImageIcon(new ImageIcon("ameise270.gif").getImage()
.getScaledInstance(xScale, yScale, Image.SCALE_SMOOTH)));
}
}
我想不出在我的线程 class 中写的任何内容可能会引起您的兴趣。我认为问题出在我已经 posted 的代码中的某处。但是,如果您确实需要更多信息,请发表评论,我会立即 post 更多信息。
再次抱歉,如果该问题已经存在。我觉得它确实如此,因为它听起来很简单。虽然我真的试图找到类似的问题,但我没有运气。
保存您创建的所有线程
threadList.add(a);
当滑块改变时迭代它
for (AmeiseThread a: threadList)
if (!source.getValueIsAdjusting()) {
int speed = source.getValue();
a.sleeptime = 1000 / speed;
}