>Java >java지도 시간 >Java 창 크기를 조정할 때 JButton이 예기치 않게 작동하는 이유는 무엇입니까?

Java 창 크기를 조정할 때 JButton이 예기치 않게 작동하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-14 17:21:15455검색

Why are my JButtons behaving unexpectedly when I resize my Java window?

레이아웃에 문제가 있는 것 같습니다. 창 크기를 조정할 때 JButton이 예기치 않은 동작을 표시합니다.

설명된 문제는 Java 애플리케이션의 그래픽 사용자 인터페이스(GUI)의 예기치 않은 동작과 관련이 있습니다. 창 크기가 조정될 때. 창 크기를 조정하면 버튼의 텍스트와 색상을 포함하여 특정 JButton 구성 요소의 동작이 변경됩니다.

문제 분석

문제를 이해하려면 코드를 검사하고 창 크기와 JButton 구성 요소 동작 간의 종속성을 식별합니다. 문제는 구성 요소의 배치 방식이나 속성 관리 방식에 있을 수 있습니다.

코드 검토

제공된 코드는 ComponentAdapter를 사용하여 크기 변화를 감지합니다. DrawingArea 구성요소. 크기가 변경되면 다음 작업이 실행됩니다.

  • 타이머가 다시 시작됩니다.
  • "시작/중지" 버튼의 텍스트가 "중지"로 변경됩니다.
  • isTimerRunning이 true로 설정됩니다.

이러한 작업은 의심할 여지 없이 창 크기가 조정될 때 타이머가 시작되는지 확인하십시오. 그러나 코드는 JButton 구성 요소와 같은 다른 구성 요소의 크기 조정을 처리하지 않습니다.

예기치 않은 동작의 원인

예기치 않은 동작은 JButton 구성 요소의 레이아웃 방식으로 인해 발생할 수 있습니다. 그리고 그 속성이 어떻게 관리되는지. 창 크기가 조정되면 레이아웃 관리자가 구성 요소를 다시 정렬할 수 있으며 이는 해당 속성에 영향을 미칠 수 있습니다. 예를 들어, 버튼의 텍스트가 잘리거나 색상이 변경될 수 있습니다.

가능한 해결 방법

문제를 해결하려면 다음 제안 사항을 고려하십시오.

  1. 크기 조정을 더 잘 처리하는 레이아웃 관리자 사용: GridLayout을 다음과 같이 크기 조정 처리에 더 적합한 레이아웃 관리자로 교체합니다. GridBagLayout 또는 SpringLayout.
  2. 절대 위치 지정 사용: 레이아웃 관리자를 사용하는 대신 절대 위치 지정을 사용하여 JButton 구성 요소의 크기와 위치를 수동으로 지정할 수 있습니다. 이 접근 방식을 사용하면 창 크기에 관계없이 구성 요소가 원하는 속성을 유지할 수 있습니다.
  3. 레이아웃 관리자에 속성 추가: 특정 레이아웃 관리자를 사용하려는 경우 해당 레이아웃에 속성을 추가할 수 있습니다. 창 크기를 조정할 때 동작 방식을 제어합니다. 이를 통해 특정 요구 사항에 맞게 레이아웃 관리자를 사용자 정의할 수 있습니다.
  4. SwingWorker 사용: SwingWorker를 사용하면 별도의 스레드에서 장기 실행 작업을 수행할 수 있으며, 이는 GUI 오류를 방지하는 데 도움이 됩니다.

구현 예

다음은 레이아웃을 관리하고 JButton 구성 요소가 원하는 속성을 유지하도록 보장하는 GridBagLayout:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

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

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

        drawingArea = new DrawingArea(x, y, backgroundColour, foregroundColour, diameter);
        drawingArea.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent ce) {
                timer.restart();
                startStopButton.setText("Stop");
                isTimerRunning = true;
            }
        });

        JPanel contentPane = frame.getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(makeButtonPanel(), BorderLayout.EAST);
        contentPane.add(drawingArea, BorderLayout.CENTER);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JPanel makeButtonPanel() {
        buttonPanel = new JPanel(new GridBagLayout());
        buttonPanel.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 5));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;

        startStopButton = makeButton("Start", gbc, 0, 0);
        colourButton = makeButton("Change Color", gbc, 0, 1);
        exitButton = makeButton("Exit", gbc, 0, 2);

        return buttonPanel;
    }

    private JButton makeButton(String text, GridBagConstraints gbc, int row, int column) {
        JButton button = new JButton(text);
        button.setOpaque(true);
        button.setForeground(Color.WHITE);
        button.setBackground(Color.GREEN.DARKER);
        button.setBorder(BorderFactory.createLineBorder(Color.GRAY, 4));
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                if (button == startStopButton) {
                    if (!isTimerRunning) {
                        startStopButton.setText("Stop");
                        timer.start();
                        isTimerRunning = true;
                    } else {
                        startStopButton.setText("Start");
                        timer.stop();
                        isTimerRunning = false;
                    }
                } else if (button == colourButton) {
                    clut.add(clut.remove());
                    foregroundColour = clut.peek();
                    drawingArea.setXYColourValues(x, y, backgroundColour, foregroundColour);
                    colourButton.setBackground(foregroundColour);
                } else if (button == exitButton) {
                    timer.stop();
                    System.exit(0);
                }
            }
        });
        gbc.gridx = column;
        gbc.gridy = row;
        buttonPanel.add(button, gbc);
        return button;
    }

    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) {
        SwingUtilities.invokeLater(() -> new BallAnimation().createAndDisplayGUI());
    }
}

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) {

위 내용은 Java 창 크기를 조정할 때 JButton이 예기치 않게 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.