Некорректное отображение переменной - Java

Узнай цену своей работы

Формулировка задачи:

Имеется переменная "q", по нажатию на кнопку ее значение должно увеличиваться на 1 (так и происходит), но также это все должно выводиться на экран с помощью метода paintComponent. Когда я нажимаю на кнопку, то новое значение переменной просто отображается поверх старого и так происходит и далее.
Листинг программы
  1. int q;
  2. public myPanel()
  3. {
  4. setLayout(null);
  5. setFocusable(true);
  6. Timer timer = new Timer(1,new ActionListener(){
  7. public void actionPerformed(ActionEvent e){
  8. repaint();
  9. }
  10. });
  11. timer.start();
  12. JButton b = new JButton();
  13. b.setText("+");
  14. b.setBounds(159, 45, 41, 25);
  15. b.setFocusable(false);
  16. b.setBackground(Color.WHITE);
  17. b.addActionListener(new ActionListener()
  18. {
  19. public void actionPerformed(ActionEvent e) {
  20. q+=1;
  21. }
  22. });
  23. add(b);
  24. JButton b1 = new JButton();
  25. b1.setText("-");
  26. b1.setBounds(159, 75, 41, 25);
  27. b1.setFocusable(false);
  28. b1.setBackground(Color.WHITE);
  29. add(b1);
  30. }
  31. public void paintComponent(Graphics gr)
  32. {
  33. gr.drawString(String.valueOf(q), 140, 80);
  34. }

Решение задачи: «Некорректное отображение переменной»

textual
Листинг программы
  1. import java.awt.Color;
  2. import java.awt.Graphics;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import javax.swing.JButton;
  6. import javax.swing.JFrame;
  7. import javax.swing.JPanel;
  8.  
  9. public class TestMyPanel extends JFrame {
  10.     private static final long serialVersionUID = 1L;
  11.  
  12.     TestMyPanel() {
  13.         setSize(400, 400);
  14.         setLocationRelativeTo(null);
  15.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  16.         add(new MyPanel());
  17.         setVisible(true);
  18.     }
  19.  
  20.     public static void main(String[] args) {
  21.         new TestMyPanel();
  22.     }
  23.  
  24.     private class MyPanel extends JPanel implements ActionListener {
  25.         private static final long serialVersionUID = 1L;
  26.         private JButton plusButton, minusButton;
  27.         int q = 0;
  28.  
  29.         MyPanel() {
  30.             setLayout(null);
  31.             setFocusable(true);
  32.  
  33.             plusButton = new JButton("+");
  34.             plusButton.setBounds(159, 45, 41, 25);
  35.             plusButton.setFocusable(false);
  36.             plusButton.setBackground(Color.WHITE);
  37.             plusButton.addActionListener(this);
  38.  
  39.             minusButton = new JButton("-");
  40.             minusButton.setBounds(159, 75, 41, 25);
  41.             minusButton.setFocusable(false);
  42.             minusButton.setBackground(Color.WHITE);
  43.             minusButton.addActionListener(this);
  44.  
  45.             add(plusButton);
  46.             add(minusButton);
  47.         }
  48.  
  49.         @Override
  50.         public void actionPerformed(ActionEvent evnt) {
  51.             Object source = evnt.getSource();
  52.             if (source == plusButton) {
  53.                 q++;
  54.             } else if (source == minusButton) {
  55.                 q--;
  56.             }
  57.             // если будет больше кнопок, то может быть не для каждой надо вызывать repaint (просто перенести в каждый иф, где надо перерисовать)
  58.             repaint();
  59.         }
  60.  
  61.         @Override
  62.         public void paintComponent(Graphics g) {
  63.             super.paintComponent(g);
  64.             g.drawString(String.valueOf(q), 140, 80);
  65.         }
  66.  
  67.     }
  68. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы