Algo parece estar mal con el diseño, JButton muestra un comportamiento inesperado al cambiar el tamaño de la ventana

16 minutos de lectura

Algo parece estar mal con el diseno JButton muestra un
bonita vaca

JRE Versión 1.7 Actualización 3

COMPORTAMIENTO ESPERADO

Mientras ejecuto el programa, funciona como se esperaba, todo funciona sin problemas. Como cuando hago clic en STOP JButton la animación se detiene y el texto en el mismo JButton cambios a START. Ahora cuando hago clic en BALL COLOUR JButtonel color de la BALL cambia, así como el color de la BALL COLOUR JBUTTONtambién cambia, a la del BALL. Todo este comportamiento funciona si ejecuto mi aplicación tal como está sin cambiar el tamaño.

COMPORTAMIENTO INESPERADO

pero cuando yo RESIZE mi JFrametirando de la Right Sidees entonces cuando se muestra un comportamiento inesperado de mi Aplicación, en el sentido de que si presiono STOP JButton y luego haga clic en BALL COLOUR botón, el texto en el JButton hizo clic anteriormente cuyo texto cambió a START cambiará a STOP de nuevo cuando no debe ser así, así como el color de la BALL COLOUR JButton permanecerá sin cambios o cambiará a BLUE, cuando se debe cambiar al color de la pelota. Adjunto las fotos para más información. Pero si intenta cambiar su tamaño de nuevo a su tamaño original o más cerca de eso, entonces las cosas volverán a la normalidad. Por qué está pasando esto ? Cualquier idea o pista será muy apreciada.

A medida que mi aplicación se ejecuta con COMPORTAMIENTO ESPERADO como se describió anteriormente :

Comportamiento esperado

Y aquí el COMPORTAMIENTO INESPERADO

Comportamiento inesperado

LÍNEA DE FONDO :

Por qué la aplicación se ejecuta normalmente como debería ser, en el BEGINNING pero no cuando RESIZED arrastrando es RIGHT SIDEpero nuevamente, si lo lleva a su tamaño original o más cerca de él, las cosas vuelven a la normalidad, ¿funciona como se esperaba?

Entonces, considerando el escenario, ¿estoy haciendo algo mal en el programa? ¿O es exactamente esta la situación, en la que debería estar usando el SwingWorkerO ¿Es esto un problema con el Layouto algo oculto relacionado con Content Pane. Por favor, pon algo de luz 🙂

aquí está el código que estoy usando, lo reduje al mínimo, ya que creo que demuestra mi problema:

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

**ÚLTIMA EDICIÓN: **

MÁS RECIENTE

  • Me acabo de dar cuenta, si maximizarás el JFrame al menos una vez, entonces parece que todo funciona como se esperaba 🙁

    – BUENA VACA

    24 de marzo de 2012 a las 13:59

  • No veo el problema aquí (es decir, sin maximizar el primero) usando un JRE 1.6 con ese código como se muestra (después de eliminar el tercer argumento para createLineBorder!). Aparentemente está usando 1.7 (dado que el tercer argumento se introdujo en 7). ¿Podría ser esto un error en el JRE que se está utilizando?

    – Andrés Thompson

    24 de marzo de 2012 a las 18:01


  • Ahha, supongo que podría ser un error, estoy usando 1.7 actualización 3, anteriormente no puedo usar setLayout(new FlowLayout(FlowLayout.LEFT)); con 1.7 actualización 1, puede que tengas razón :-), ya que si maximizo entonces todo está bien, solo cuando cambio el tamaño arrastrando el lado derecho, solo entonces me da este comportamiento perverso. Podría probarlo en otro lugar nuevamente, gracias nuevamente por la ayuda 🙂

    – BUENA VACA

    24 de marzo de 2012 a las 18:40

  • Recomiendo 1) Hacer una versión que descargue la versión JRE 2) Obtener resultados de prueba para confirmar un patrón. 3) Verifique la base de datos de errores en busca de duplicados. 4) Presentar uno nuevo, si no se encuentra ninguno. (Por supuesto, puede saltar al paso 3 y volver al 1 y 2).

    – Andrés Thompson

    24 de marzo de 2012 a las 18:46

  • Solo si maximizo toda la ventana una vez, entonces no surge ningún problema :-), solo cuando cambio el tamaño arrastrando el lado derecho, las cosas se complican 🙁

    – BUENA VACA

    24 de marzo de 2012 a las 18:49

Algo parece estar mal con el diseno JButton muestra un
dios de la basura

El problema con su muy buen ejemplo puede depender de la plataforma, pero puedo ofrecer algunas observaciones:

  • No está agregando ni quitando componentes, por lo que no necesita revalidate().

  • Debido a que el color de fondo es una propiedad vinculada de los botones, no necesita las llamadas posteriores para repaint().

  • hacer necesitar repaint() en tu costumbre DrawingAreapero es posible que desee experimentar agregando compatibilidad con cambios de propiedades, como se sugiere aquí.

  • Color.white no puede ser brighter() y Color.black no puede ser darker(); Color.darkGray.darker() es Color.black().

  • La siguiente variación usa un Queue<Color> para simplificar el cambio de colores.

la captura de pantalla

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

  • Esos ejemplos fueron maravillosos nuevamente, como siempre :-), en realidad yo escribí esos revalidate() y repaint() cositas para arreglar las cosas, aunque no están en mi programa actual. Sin embargo, encontré la razón, en cuanto a lo que está causando el problema, pero realmente no sé cómo rectificar eso, el problema surge cuando la instancia de Timer es en RUNNING estado. Cuando se detiene, entonces no surge ningún problema. había intentado configurar timer.stop dentro de colourButtons actionPerformed(...) método, pero fue en vano. JAJAJA. Dios sabe qué hacer ahora 🙂 +1 nuevamente por el maravilloso enlace y la amable ayuda 🙂

    – BUENA VACA

    24 de marzo de 2012 a las 16:09


  • No sé si es la razón real, ya que, si no se cambia el tamaño, entonces las cosas funcionan como se esperaba. Puede ser que sea una cosa dependiente de la plataforma 🙂 Lo probaré con otros para saber cómo funciona en otras máquinas 🙂

    – BUENA VACA

    24 de marzo de 2012 a las 16:19

  • Lo siento, no se me ocurre nada. He agregado una variación reciente como referencia.

    – dios de la basura

    24 de marzo de 2012 a las 19:17

  • Cambié a la versión 6 de JRE y todo funciona bien, en esto, aunque si elimino todo setBorder(...) declaraciones para cada JButton en JRE 1.7, incluso eso no pudo resolver el problema. Pero volver a 1.6 solucionó las cosas. Así que las cosas están resueltas, pero cómo y qué lo hizo sigue siendo un misterio 🙂 Así que parece que es un error en la actualización 3 de JDK 1.7 🙁

    – BUENA VACA

    25 de marzo de 2012 a las 5:17


  • Interesante; usando 1.7.0_02 en Windows 7, no pude reproducir la anomalía. Si todavía está en su máquina, es posible que pueda ponerlo en el %path%.

    – dios de la basura

    25 de marzo de 2012 a las 5:47

Parece que hay algo mal con BorderLayout.LINE_END cosita, solo cuando coloco el buttonPanel en LINE_END, estoy obteniendo resultados no deseados. Había intentado usar solo uno JButton, en lugar de tres como última medida, para arreglar cositas. Ahora el problema que solía venir como se muestra en esta foto:

LINE_END

se ha solucionado cambiando la posición del JButton Panel a LINE_START o usando JRE version 1.6 update 31en la foto de la siguiente manera:

LINE_START

Aquí está el código utilizado para este ejemplo:

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

  • ¡Extraño! ¿Ocurre también con BorderLayout.EAST (es que el crudo equivalente de LINE_END?)?

    – Andrés Thompson

    25 de marzo de 2012 a las 9:10


  • Sí, el mismo problema, con BorderLayout.EAST 🙁

    – BUENA VACA

    25 de marzo de 2012 a las 9:21

  • Probablemente ya habría planteado un informe de error. No puedo decir que estoy impresionado con ninguna de las implementaciones de 1.7 que he visto hasta ahora. Parecen muy buggy.

    – Andrés Thompson

    25 de marzo de 2012 a las 9:25

  • Ahha, alguien más está hablando del mismo problema 🙂 CAMBIO DE TAMAÑO HORIZONTAL, incluso su componente en ESTE desaparece al cambiar el tamaño, LOL

    – BUENA VACA

    25 de marzo de 2012 a las 10:00

  • Incluso OP había escrito en su comentario, debajo de la respuesta aceptada, que nunca funcionó :-), al agregar más componentes.

    – BUENA VACA

    25 de marzo de 2012 a las 10:03


1646754494 536 Algo parece estar mal con el diseno JButton muestra un
mKorbel

tal vez te ayude con dos partes de, creo que Gráficos/2D está designado para usar Temporizador de oscilación exclusivamente,

  • Ese es otro ejemplo maravilloso (+1 por eso), pero estoy confundido, dónde está exactamente el problema ya que la parte del dibujo parece funcionar bien. Solo el JButtonEl texto y el color de muestra un comportamiento extraño, en resize!!!

    – BUENA VACA

    24 de marzo de 2012 a las 7:59

  • cierto es que este fue mi primer toque de gráficos, solo exhibiciones, no lo intenté de nuevo, seguro que está esperando una sugerencia real sobre cómo funciona Colision

    – mKorbel

    24 de marzo de 2012 a las 9:02

  • Me acabo de dar cuenta, si traigo el JFrame vuelve a su tamaño original o más cerca de eso, luego las cosas vuelven a la normalidad. ¿Puede ser esto un problema con el diseño o algo así? 🙂

    – BUENA VACA

    24 de marzo de 2012 a las 11:04

No estoy seguro de haber encontrado una solución para su sistema, pero ajustando el código a

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

funciona en mi sistema (OS X con Java 1.7). Nota la setOpaque llamada, que es necesaria para que el setBackground la llamada tiene algún efecto como se indica en el javadoc de ese método:

Establece el color de fondo de este componente. El color de fondo se usa solo si el componente es opaco

En OS X, sin eso setOpaque llame a su código ni siquiera funciona antes de un cambio de tamaño

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad