Rumah > Java > javaTutorial > Mengapakah JButtons saya berkelakuan di luar jangkaan apabila saya mengubah saiz tetingkap Java saya?

Mengapakah JButtons saya berkelakuan di luar jangkaan apabila saya mengubah saiz tetingkap Java saya?

Barbara Streisand
Lepaskan: 2024-12-14 17:21:15
asal
455 orang telah melayarinya

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

Sesuatu kelihatan tidak kena dengan reka letak, JButton menunjukkan tingkah laku yang tidak dijangka pada saiz semula tetingkap

Isu yang diterangkan melibatkan kelakuan tidak dijangka antara muka pengguna grafik (GUI) aplikasi Java apabila tetingkap diubah saiznya. Ubah saiz tetingkap menyebabkan gelagat komponen JButton tertentu berubah, termasuk teks dan warna butang.

Analisis Masalah

Untuk memahami masalah, adalah penting untuk memeriksa kod dan mengenal pasti sebarang kebergantungan antara saiz tetingkap dan kelakuan komponen JButton. Masalahnya mungkin terletak pada cara komponen disusun atau cara sifatnya diuruskan.

Menyemak Kod

Kod yang disediakan menggunakan ComponentAdapter untuk mengesan perubahan dalam saiz Komponen Kawasan Lukisan. Apabila saiz berubah, tindakan berikut akan dicetuskan:

  • Pemasa dimulakan semula.
  • Teks pada butang "Mula/Berhenti" ditukar kepada "Berhenti".
  • isTimerRunning ditetapkan kepada benar.

Tindakan ini sudah pasti bertujuan untuk pastikan pemasa bermula apabila saiz tetingkap diubah. Walau bagaimanapun, kod tersebut tidak mengendalikan saiz semula komponen lain, seperti komponen JButton.

Punca Tingkah Laku Tidak Dijangka

Tingkah laku yang tidak dijangka mungkin disebabkan oleh cara komponen JButton dibentangkan dan bagaimana harta mereka diuruskan. Apabila tetingkap diubah saiz, pengurus susun atur mungkin menyusun semula komponen, yang boleh menjejaskan sifatnya. Sebagai contoh, teks pada butang mungkin dipotong atau warna mungkin berubah.

Penyelesaian Kemungkinan

Untuk menangani isu tersebut, pertimbangkan cadangan berikut:

  1. Gunakan pengurus reka letak yang mengendalikan saiz semula dengan lebih baik: Gantikan GridLayout dengan pengurus reka letak yang lebih sesuai untuk mengendalikan saiz semula, seperti GridBagLayout atau SpringLayout.
  2. Gunakan kedudukan mutlak: Daripada menggunakan pengurus reka letak, anda boleh menentukan saiz dan kedudukan komponen JButton secara manual menggunakan kedudukan mutlak. Pendekatan ini memastikan bahawa komponen mengekalkan sifat yang diingini tanpa mengira saiz tetingkap.
  3. Tambah sifat pada pengurus reka letak: Jika anda ingin menggunakan pengurus susun atur tertentu, anda boleh menambah sifat padanya untuk mengawal bagaimana ia berkelakuan apabila tetingkap diubah saiz. Ini membolehkan anda menyesuaikan pengurus susun atur untuk memenuhi keperluan khusus anda.
  4. Gunakan SwingWorker: SwingWorker boleh digunakan untuk melaksanakan tugasan yang berjalan lama dalam urutan yang berasingan, yang boleh membantu menghalang GUI daripada membeku semasa mengubah saiz.

Contoh Pelaksanaan

Berikut ialah contoh pelaksanaan yang menggunakan GridBagLayout untuk mengurus reka letak dan memastikan komponen JButton mengekalkan sifat yang diingini:

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) {
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah JButtons saya berkelakuan di luar jangkaan apabila saya mengubah saiz tetingkap Java saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan