설명된 문제는 Java 애플리케이션의 그래픽 사용자 인터페이스(GUI)의 예기치 않은 동작과 관련이 있습니다. 창 크기가 조정될 때. 창 크기를 조정하면 버튼의 텍스트와 색상을 포함하여 특정 JButton 구성 요소의 동작이 변경됩니다.
문제를 이해하려면 코드를 검사하고 창 크기와 JButton 구성 요소 동작 간의 종속성을 식별합니다. 문제는 구성 요소의 배치 방식이나 속성 관리 방식에 있을 수 있습니다.
제공된 코드는 ComponentAdapter를 사용하여 크기 변화를 감지합니다. DrawingArea 구성요소. 크기가 변경되면 다음 작업이 실행됩니다.
이러한 작업은 의심할 여지 없이 창 크기가 조정될 때 타이머가 시작되는지 확인하십시오. 그러나 코드는 JButton 구성 요소와 같은 다른 구성 요소의 크기 조정을 처리하지 않습니다.
예기치 않은 동작은 JButton 구성 요소의 레이아웃 방식으로 인해 발생할 수 있습니다. 그리고 그 속성이 어떻게 관리되는지. 창 크기가 조정되면 레이아웃 관리자가 구성 요소를 다시 정렬할 수 있으며 이는 해당 속성에 영향을 미칠 수 있습니다. 예를 들어, 버튼의 텍스트가 잘리거나 색상이 변경될 수 있습니다.
문제를 해결하려면 다음 제안 사항을 고려하십시오.
다음은 레이아웃을 관리하고 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!