ホームページ >Java >&#&チュートリアル >Java ウィンドウのサイズを変更すると、JButton が予期せぬ動作をするのはなぜですか?

Java ウィンドウのサイズを変更すると、JButton が予期せぬ動作をするのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-14 17:21:15460ブラウズ

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 の表示を防ぐのに役立ちます。サイズ変更中のフリーズを防ぎます。

実装例

これはGridBagLayout を使用してレイアウトを管理し、JButton コンポーネントが必要なプロパティを確実に保持するようにする実装例:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。