Heim >Java >javaLernprogramm >Warum verhalten sich meine JButtons unerwartet, wenn ich die Größe meines Java-Fensters ändere?

Warum verhalten sich meine JButtons unerwartet, wenn ich die Größe meines Java-Fensters ändere?

Barbara Streisand
Barbara StreisandOriginal
2024-12-14 17:21:15455Durchsuche

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

Etwas scheint mit dem Layout nicht zu stimmen, JButton zeigt unerwartetes Verhalten bei der Größenänderung des Fensters

Das beschriebene Problem betrifft unerwartetes Verhalten der grafischen Benutzeroberfläche (GUI) einer Java-Anwendung. wenn die Fenstergröße geändert wird. Durch die Größenänderung des Fensters ändert sich das Verhalten bestimmter JButton-Komponenten, einschließlich des Textes und der Farbe der Schaltfläche.

Analyse des Problems

Um das Problem zu verstehen, ist es wichtig, den Code zu untersuchen und Identifizieren Sie alle Abhängigkeiten zwischen der Fenstergröße und dem Verhalten der JButton-Komponenten. Das Problem kann in der Art und Weise liegen, wie die Komponenten angeordnet sind oder in der Art und Weise, wie ihre Eigenschaften verwaltet werden.

Überprüfung des Codes

Der bereitgestellte Code verwendet einen ComponentAdapter, um Änderungen in der Größe der zu erkennen DrawingArea-Komponente. Wenn sich die Größe ändert, werden folgende Aktionen ausgelöst:

  • Der Timer wird neu gestartet.
  • Der Text auf der Schaltfläche „Start/Stopp“ wird in „Stopp“ geändert.
  • isTimerRunning ist auf true gesetzt.

Diese Aktionen sollen zweifellos sicherstellen, dass der Timer startet, wenn das Fenster geöffnet ist verkleinert. Der Code verarbeitet jedoch nicht die Größenänderung anderer Komponenten, wie z. B. der JButton-Komponenten.

Ursache für unerwartetes Verhalten

Das unerwartete Verhalten wird wahrscheinlich durch die Art und Weise verursacht, wie die JButton-Komponenten angeordnet sind und wie ihre Immobilien verwaltet werden. Wenn die Fenstergröße geändert wird, ordnet der Layout-Manager die Komponenten möglicherweise neu an, was sich auf ihre Eigenschaften auswirken kann. Beispielsweise kann der Text auf den Schaltflächen abgeschnitten sein oder sich die Farben ändern.

Mögliche Lösungen

Um das Problem zu beheben, ziehen Sie die folgenden Vorschläge in Betracht:

  1. Verwenden Sie einen Layout-Manager, der die Größenänderung besser handhaben kann: Ersetzen Sie das GridLayout durch einen Layout-Manager, der besser für die Größenänderung geeignet ist. wie GridBagLayout oder SpringLayout.
  2. Absolute Positionierung verwenden: Anstatt einen Layout-Manager zu verwenden, können Sie die Größe und Position der JButton-Komponenten manuell mithilfe der absoluten Positionierung angeben. Dieser Ansatz stellt sicher, dass die Komponenten unabhängig von der Fenstergröße ihre gewünschten Eigenschaften behalten.
  3. Eigenschaften zum Layout-Manager hinzufügen: Wenn Sie einen bestimmten Layout-Manager verwenden möchten, können Sie ihm Eigenschaften hinzufügen um zu steuern, wie es sich verhält, wenn die Fenstergröße geändert wird. Dadurch können Sie den Layout-Manager an Ihre spezifischen Anforderungen anpassen.
  4. SwingWorker verwenden: SwingWorker kann verwendet werden, um lang laufende Aufgaben in einem separaten Thread auszuführen, was dazu beitragen kann, die GUI zu verhindern vor dem Einfrieren während der Größenänderung.

Beispielimplementierung

Hier ist eine Beispielimplementierung, die a verwendet GridBagLayout verwaltet das Layout und stellt sicher, dass die JButton-Komponenten ihre gewünschten Eigenschaften behalten:

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

Das obige ist der detaillierte Inhalt vonWarum verhalten sich meine JButtons unerwartet, wenn ich die Größe meines Java-Fensters ändere?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn