JRE版本1.7更新3

预期的行为

当我运行该程序时,它按预期运行,一切正常。当我单击STOP时,动画停止,并且同一JButton上的文本更改为JButton。现在,当我单击START BALL COLOUR时,JButton的颜色也会更改,BALL BALL COLOUR的颜色也会更改为JBUTTON的颜色。如果我按原样运行应用程序而不调整大小,则整个行为都可以正常工作。

意外行为

但是当我BALL拔出RESIZE时,那是我的意外行为显示应用程序的意义是,如果我按JFrameRight Side,然后单击STOP按钮,则早先单击的JButton上的文本(其文本已更改为BALL COLOUR)将在不应该的情况下再次更改为JButton,以及当应将其更改为球的颜色时,START将保持不变或转向STOP。我附上图片以获取更多信息。但是,如果您尝试将其调整为原始尺寸或更小,那么一切将恢复正常。为什么会这样呢?任何想法或线索都将不胜感激。

如上所述,当我的应用程序运行时具有预期的行为:



这里的异常行为



底线:

为什么应用程序在BALL COLOUR处正常运行,但在拖动时却无法正常运行它是JButton,但是如果再次将其恢复为原始大小或更接近,它又恢复正常,可以正常使用吗?

因此,考虑到这种情况,我在程序中做错了什么吗?还是这正是我应该使用BLUE的情况,还是BEGINNING的问题,或者与RESIZED有关的隐藏问题。请注意一下:-)

这是我正在使用的代码,由于我想证明我的问题,我将其降至最低程度:

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(在删除第三个arg到createLineBorder之后!)。您显然使用的是1.7(假设7中引入了第3个arg)。这可能是正在使用的JRE中的错误吗?

啊哈,我想可能是个错误,我使用的是1.7 Update 3,以前我不能使用setLayout(new FlowLayout(FlowLayout.LEFT));在1.7 update 1中,您可能是正确的:-),因为如果我最大化它,那一切就好了,就在我通过拖动右侧来调整大小时,只有这样才能给我这种邪恶的行为。我可能会在其他地方再次进行测试,再次感谢您的帮助:-)

我建议1)创建一个转储JRE版本的版本2)获取测试结果以确认模式。 3)检查错误数据库是否重复。 4)寄回新的,如果找不到。 (当然,您可以跳至第3步和第1步和第2步。)

就算我最大化整个窗口一次,也不会出现问题:-),只有当我通过拖动右侧调整窗口大小时,事情才会变得混乱:(

#1 楼

您的非常好的示例的问题可能取决于平台,但是我可以提供一些观察结果:


您不需要添加或删除组件,因此不需要revalidate()
因为背景颜色是按钮的绑定属性,所以您不需要后续调用repaint()
您确实需要在自定义repaint()中添加DrawingArea,但是您可能想尝试添加属性更改支持
Color.white不能为brighter()Color.black不能为darker()Color.darkGray.darker()Color.black()
下面的变体使用Queue<Color>简化了颜色更改。



import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

/** @see https://stackoverflow.com/q/9849950/230513 */
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 Queue<Color> clut = new LinkedList<Color>(Arrays.asList(
        Color.BLUE.darker(),
        Color.MAGENTA.darker(),
        Color.BLACK,
        Color.RED.darker(),
        Color.PINK,
        Color.CYAN.darker(),
        Color.DARK_GRAY,
        Color.YELLOW.darker(),
        Color.GREEN.darker()));
    private Color backgroundColour;
    private Color foregroundColour;
    private ActionListener timerAction = new ActionListener() {

        @Override
        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() {

        @Override
        public void componentResized(ComponentEvent ce) {
            timer.restart();
            startStopButton.setText("Stop");
            isTimerRunning = true;
        }
    };

    public BallAnimation() {
        x = y = 0;
        positiveX = positiveY = true;
        speedValue = 1;
        isTimerRunning = false;
        diameter = 50;
        backgroundColour = Color.white;
        foregroundColour = clut.peek();
        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(new GridLayout(0, 1));
        buttonPanel.setBorder(BorderFactory.createLineBorder(Color.darkGray, 5));

        startStopButton = new JButton("Start");
        startStopButton.setOpaque(true);
        startStopButton.setForeground(Color.white);
        startStopButton.setBackground(Color.green.darker());
        startStopButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                if (!isTimerRunning) {
                    startStopButton.setText("Stop");
                    timer.start();
                    isTimerRunning = true;
                } else if (isTimerRunning) {
                    startStopButton.setText("Start");
                    timer.stop();
                    isTimerRunning = false;
                }
            }
        });
        startStopButton.setBorder(BorderFactory.createLineBorder(Color.gray, 4));
        buttonPanel.add(startStopButton);

        colourButton = new JButton("Change Color");
        colourButton.setOpaque(true);
        colourButton.setForeground(Color.white);
        colourButton.setBackground(clut.peek());
        colourButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                //timer.restart();
                clut.add(clut.remove());
                foregroundColour = clut.peek();
                drawingArea.setXYColourValues(x, y, backgroundColour, foregroundColour);
                colourButton.setBackground(foregroundColour);
            }
        });
        colourButton.setBorder(BorderFactory.createLineBorder(Color.gray, 4));
        buttonPanel.add(colourButton);

        exitButton = new JButton("Exit");
        exitButton.setBackground(Color.red);
        exitButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                timer.stop();
                System.exit(0);
            }
        });
        exitButton.setBorder(BorderFactory.createLineBorder(Color.red.darker(), 4));
        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() {

            @Override
            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, 5));
    }

    public void setXYColourValues(int x, int y, Color bColor, Color fColor) {
        this.x = x;
        this.y = y;
        backgroundColor = bColor;
        foregroundColor = fColor;
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return (new Dimension(500, 400));
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(backgroundColor);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(foregroundColor);
        g.fillOval(x, y, ballDiameter, ballDiameter);
    }
}


评论


像往常一样,这些示例还是很棒的:-),实际上我写了那些revalidate()和repaint()东西来整理事物,尽管它们不在我的实际程序中。虽然我已经找到了引起问题的原因,但是我真的不知道该如何解决,当Timer实例处于RUNNING状态时,问题就来了。当它停止时,就没有问题了。我曾尝试在colourButtons actionPerformed(...)方法中设置timer.stop,但无济于事。大声笑。上帝知道现在该怎么做:-)再次+1以获得美妙的链接和友善的帮助:-)

– nICE COW
2012年3月24日16:09



Dunno,如果这是实际原因,那么,如果不进行任何调整大小,那么事情按预期进行。可能是与平台有关的问题:-)将与他人进行测试,以了解其在其他计算机上的性能:-)

– nICE COW
2012年3月24日16:19

抱歉,什么都没想到。我添加了最新的变体供参考。

–垃圾神
2012年3月24日19:17

我转移到了JRE版本6,并且一切工作都很好,尽管如果我删除JRE 1.7上每个JButton的整个setBorder(...)语句,即使这样也无法解决问题。但是回到1.6可以解决问题。因此,事情已经解决了,但是如何实现以及仍然是一个谜:-)看来这是JDK 1.7更新3中的一个错误:()

– nICE COW
2012-03-25 5:17



有趣;在Windows 7上使用1.7.0_02,我无法重现异常。如果它仍在您的计算机上,则可以将其放在%path%中。

–垃圾神
2012-03-25 5:47

#2 楼

似乎BorderLayout.LINE_END有点问题,仅当我将buttonPanel放在LINE_END上时,我才得到了不良结果。我试图只使用一个JButton来解决问题,而不是使用3个作为最新措施。现在,出现了如下图所示的问题:通过将JButton面板的位置更改为LINE_START或使用JRE version 1.6 update 31,可以解决



图片如下:



这里是此示例使用的代码:

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

    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_START);
        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));

        colourButton = new JButton("BALL COLOUR");
        colourButton.setOpaque(true);
        colourButton.setBackground(colours[colourCounter]);
        colourButton.setForeground(Color.WHITE);
        colourButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                System.out.println("COLOUR JButton Clicked!");
                if (timer.isRunning())
                    timer.stop();
                colourCounter++;
                if (colourCounter == 9)
                    colourCounter = 0;
                foregroundColour = colours[colourCounter];
                drawingArea.setXYColourValues(x, y, backgroundColour
                                                    , foregroundColour);
                colourButton.setBackground(foregroundColour);
                if (!timer.isRunning())
                    timer.start();
            }
        });
        colourButton.setBorder(BorderFactory.createLineBorder(
                                    Color.WHITE, 2, true));
        buttonPanel.add(colourButton);

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


评论


怪异的! BorderLayout.EAST是否也会发生(这与LINE_END的粗略等价?)吗?

–安德鲁·汤普森(Andrew Thompson)
2012年3月25日9:10



是的,同样的问题,BorderLayout.EAST :(

– nICE COW
2012-03-25 9:21

我现在可能会提出一个错误报告。不能说到目前为止,我对1.7的实现印象深刻。他们似乎很越野车。

–安德鲁·汤普森(Andrew Thompson)
2012年3月25日在9:25

啊哈,其他人都在谈论同样的问题:-)水平调整大小,即使他在EAST的组件在调整大小时也丢失了,哈哈

– nICE COW
2012年3月25日10:00

在添加更多组件时,甚至OP在他/她的评论中(在接受的答案下方)都写了它永远不会起作用:-)。

– nICE COW
2012-03-25 10:03



#3 楼

也许会为您提供两部分帮助,我认为Graphics / 2D被指定为专门使用Swing Timer,

评论


这是另一个很棒的示例(为此,该示例为+1),但是我很困惑,问题出在哪里,因为绘图部分似乎工作正常。只是JButton的文本和颜色在调整大小时显示奇怪的行为!!!

– nICE COW
2012年3月24日7:59

的确是,这是我对Graphics的第一次接触,只是展览,没有再尝试过,请确保您正在等待碰撞的真实建议

– mKorbel
2012年3月24日上午9:02

我刚刚意识到,如果我将JFrame恢复为原始大小或更小,那么事情又又恢复正常了,这可能是Layout或其他问题吗?

– nICE COW
2012-3-24在11:04

#4 楼

我不确定是否找到适用于您系统的解决方案,但是将代码调整为

colourButton = new JButton( "BALL COLOUR" );
colourButton.setOpaque( true );
colourButton.setBackground( colours[ colourCounter ] );
colourButton.setForeground( Color.WHITE );


在我的系统上运行(带有Java 1.7的OS X)。请注意setOpaque调用,此调用是必需的,以便setBackground调用具有该方法的javadoc中所述的任何效果:


设置此组件的背景色。仅当组件不透明时才使用背景颜色



在OS X上,如果没有setOpaque调用,您的代码甚至无法在调整大小之前起作用

评论


不,很抱歉,但是事情再次出现了相同的结果,当您通过拖动右侧来调整JFrame的大小时,colourButton的颜色保持不变或显示某些异常行为。虽然如果我最大化窗口,则它可以正常工作,或者我将窗口调整为原始尺寸或更小。但是,当我调整窗口大小时,还是再次出现相同的行为:(尽管为此付出了+1。感谢您对此的友好帮助:-)

– nICE COW
2012年3月24日13:28

试试看,在程序启动时,拖动JFrame的右侧以更改其宽度,现在单击colourButton,查看其颜色永不改变:-(

– nICE COW
2012年3月24日13:35



虽然如果您不会调整大小或只是稍微改变它以使球可以移动,那么一切都会正常进行,就像往常一样,只是当我尝试进一步调整大小时,事情会出错,:(那件事困扰着我。这里有些奇怪的事情:(我想这对我来说是个坏消息。

– nICE COW
2012年3月24日13:43



不,如果我使用setOpaque调用,它将始终在我的PC上运行。没有此调用,无论是否调整大小,它都将无法工作

–罗宾
2012年3月24日14:25

@Robin:使用setOpaque()为Aqua的背景色+1想法。有时我会采取这种笨拙的选择。巴厘岛甘甘迪普(Gagandeep Bali):与罗宾(Robin)一样,我没有发现异常。

–垃圾神
2012年3月24日14:41