Heim >Java >javaLernprogramm >Warum verhalten sich meine JButtons unerwartet, wenn ich die Größe meines Java-Fensters ändere?
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.
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.
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:
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.
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.
Um das Problem zu beheben, ziehen Sie die folgenden Vorschläge in Betracht:
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!