【发布时间】:2012-04-08 15:32:33
【问题描述】:
JRE 版本 1.7 更新 3
预期行为
当我运行程序时,它按预期运行,一切正常。当我单击STOP JButton 时,动画停止并且同一JButton 上的文本更改为START。现在,当我点击BALL COLOURJButton 时,BALL 的颜色会发生变化,BALL COLOUR 的颜色也会发生变化,JBUTTON 的颜色也会变化为BALL 的颜色。如果我按原样运行我的应用程序而不调整大小,则整个行为都有效。
意外行为
但是当我RESIZE 我的JFrame 时,通过拉动Right Side,就会显示我的应用程序的意外行为,也就是说如果我按下STOP JButton 然后点击@987654339 @按钮,之前单击的JButton上的文本更改为START的文本将在不应该更改时再次更改为STOP,以及BALL COLOUR的颜色JButton将保持不变或将转至BLUE,此时应更改为球的颜色。我附上图片以获取更多信息。但是,如果您尝试将其调整回原始大小或更接近原始大小,那么一切都会恢复正常。为什么会这样?任何想法或线索将不胜感激。
当我的应用程序以上述预期行为运行时:
这里是意外行为
底线:
为什么应用程序正常运行,在 BEGINNING 处,但不是在 RESIZED 时通过拖动它是 RIGHT SIDE,但是如果你将它带到它的原始大小或更接近它,事情就会发生恢复正常,按预期工作?
所以考虑到这种情况,我在程序中做错了什么吗?或者这正是我应该使用SwingWorker 的情况,或者这是Layout 的问题,还是与Content Pane 相关的隐藏问题。请放一些光:-)
这是我正在使用的代码,我已经把它降到最低限度,因为我想证明我的问题:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class BallAnimation
{
private int x;
private int y;
private boolean positiveX;
private boolean positiveY;
private boolean isTimerRunning;
private int speedValue;
private int diameter;
private DrawingArea drawingArea;
private Timer timer;
private int colourCounter;
Color[] colours = {
Color.BLUE.darker(),
Color.MAGENTA.darker(),
Color.BLACK.darker(),
Color.RED.darker(),
Color.PINK.darker(),
Color.CYAN.darker(),
Color.DARK_GRAY.darker(),
Color.YELLOW.darker(),
Color.GREEN.darker()
};
private Color backgroundColour;
private Color foregroundColour;
private ActionListener timerAction = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
x = getX();
y = getY();
drawingArea.setXYColourValues(x, y, backgroundColour
, foregroundColour);
}
};
private JPanel buttonPanel;
private JButton startStopButton;
private JButton speedIncButton;
private JButton speedDecButton;
private JButton resetButton;
private JButton colourButton;
private JButton exitButton;
private ComponentAdapter componentAdapter = new ComponentAdapter()
{
public void componentResized(ComponentEvent ce)
{
timer.restart();
startStopButton.setText("STOP");
isTimerRunning = true;
}
};
public BallAnimation()
{
x = y = 0;
positiveX = positiveY = true;
speedValue = 1;
colourCounter = 0;
isTimerRunning = false;
diameter = 50;
backgroundColour = Color.WHITE.brighter();
foregroundColour = colours[colourCounter];
timer = new Timer(10, timerAction);
}
private void createAndDisplayGUI()
{
JFrame frame = new JFrame("Ball Animation");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
drawingArea = new DrawingArea(x, y
, backgroundColour, foregroundColour, diameter);
drawingArea.addComponentListener(componentAdapter);
frame.add(makeButtonPanel(), BorderLayout.LINE_END);
frame.add(drawingArea, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
private JPanel makeButtonPanel()
{
buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(0, 1));
buttonPanel.setBorder(BorderFactory.createLineBorder(
Color.DARK_GRAY, 5, true));
startStopButton = new JButton("START");
startStopButton.setBackground(Color.GREEN.darker());
startStopButton.setForeground(Color.WHITE.brighter());
startStopButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
System.out.println("START/STOP JButton Clicked!");
if (!isTimerRunning)
{
startStopButton.setText("STOP");
timer.start();
isTimerRunning = true;
buttonPanel.revalidate();
buttonPanel.repaint();
}
else if (isTimerRunning)
{
startStopButton.setText("START");
timer.stop();
isTimerRunning = false;
buttonPanel.revalidate();
buttonPanel.repaint();
}
}
});
startStopButton.setBorder(BorderFactory.createLineBorder(
Color.WHITE, 4, true));
buttonPanel.add(startStopButton);
colourButton = new JButton("BALL COLOUR");
colourButton.setBackground(colours[colourCounter]);
colourButton.setForeground(Color.WHITE);
colourButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
System.out.println("COLOUR JButton Clicked!");
//timer.restart();
colourCounter++;
if (colourCounter == 9)
colourCounter = 0;
foregroundColour = colours[colourCounter];
drawingArea.setXYColourValues(x, y, backgroundColour
, foregroundColour);
//drawingArea.setForegroundForBall(foregroundColour);
colourButton.setBackground(foregroundColour);
colourButton.revalidate();
colourButton.repaint();
//timer.start();
}
});
colourButton.setBorder(BorderFactory.createLineBorder(
Color.WHITE, 2, true));
buttonPanel.add(colourButton);
exitButton = new JButton("EXIT");
exitButton.setBackground(Color.RED.darker());
exitButton.setForeground(Color.WHITE.brighter());
exitButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
System.out.println("EXIT JButton Clicked!");
timer.stop();
System.exit(0);
}
});
exitButton.setBorder(BorderFactory.createLineBorder(
Color.RED.darker().darker(), 4, true));
buttonPanel.add(exitButton);
return buttonPanel;
}
private int getX()
{
if (x < 0)
positiveX = true;
else if (x >= drawingArea.getWidth() - diameter)
positiveX = false;
return (calculateX());
}
private int calculateX()
{
if (positiveX)
return (x += speedValue);
else
return (x -= speedValue);
}
private int getY()
{
if (y < 0)
positiveY = true;
else if (y >= drawingArea.getHeight() - diameter)
positiveY = false;
return (calculateY());
}
private int calculateY()
{
if (positiveY)
return (y += speedValue);
else
return (y -= speedValue);
}
public static void main(String... args)
{
Runnable runnable = new Runnable()
{
public void run()
{
new BallAnimation().createAndDisplayGUI();
}
};
SwingUtilities.invokeLater(runnable);
}
}
class DrawingArea extends JComponent
{
private int x;
private int y;
private int ballDiameter;
private Color backgroundColor;
private Color foregroundColor;
public DrawingArea(int x, int y
, Color bColor, Color fColor, int dia)
{
this.x = x;
this.y = y;
ballDiameter = dia;
backgroundColor = bColor;
foregroundColor = fColor;
setBorder(BorderFactory.createLineBorder(
Color.DARK_GRAY.darker(), 5, true));
}
public void setXYColourValues(int x, int y
, Color bColor, Color fColor)
{
this.x = x;
this.y = y;
backgroundColor = bColor;
foregroundColor = fColor;
repaint();
}
public Dimension getPreferredSize()
{
return (new Dimension(500, 400));
}
public void paintComponent(Graphics g)
{
g.setColor(backgroundColor);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(foregroundColor);
g.fillOval(x, y, ballDiameter, ballDiameter);
}
}
**最新编辑:**
【问题讨论】:
-
我刚刚意识到,如果您将
JFrame至少最大化一次,那么似乎一切都按预期工作:( -
我在这里没有看到问题(即没有最大化第一个),使用带有所示代码的 1.6 JRE(在将第三个参数删除到
createLineBorder! 之后)。您显然正在使用 1.7(鉴于第 3 个参数是在 7 中引入的)。这可能是正在使用的 JRE 中的错误吗? -
啊哈,我想这可能是一个错误,我使用的是 1.7 更新 3,以前我不能使用
setLayout(new FlowLayout(FlowLayout.LEFT));和 1.7 更新 1,你可能是对的 :-),因为如果我最大化然后一切都好,只是当我通过拖动右侧调整它的大小时,它才会给我这种邪恶的行为。我可能会在其他地方再次对其进行测试,再次感谢您的帮助:-) -
我建议 1) 制作转储 JRE 版本的版本 2) 获取测试结果以确认模式。 3) 检查错误数据库是否有重复项。 4) 如果没有找到,请提交一个新的。 (当然,您可能会跳到第 3 步并返回到第 1 步和第 2 步。)
-
如果我将整个窗口最大化一次,那么就不会出现问题:-),只有当我通过拖动右侧来调整它的大小时,事情才会变得混乱:(
标签: java swing resize jframe jbutton