Кнопка вызывает frame.repaint (), даже когда я не сказал это. Что я сделал не так? - PullRequest
0 голосов
/ 18 апреля 2020

Я только начал изучать java 4 дня go и читаю Head First Java, медленный прогресс в Главе 12. Мой JButton eastb запускает frame.repaint (), даже когда я этого не говорил. Я только сказал ему, чтобы вызвать setText () при нажатии. Почему это происходит? Что я пропустил?

И что такое @Override? не термин «переопределение», как в методах, а сам термин «переопределение».

\\

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class Exp {
     JFrame frame;
     JLabel label;
     JButton eastb;
     JButton southb;

     public static void main(String[] args) {
      Exp a = new Exp();
      a.start();
     }

     public void start() {
      frame = new JFrame();
      frame.setSize(700,700);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      label = new JLabel("I'm stored text only");
      frame.getContentPane().add(BorderLayout.WEST, label);

      eastb = new JButton("Don't click me");
      frame.getContentPane().add(BorderLayout.EAST, eastb);
      eastb.addActionListener(new EastButton());

      southb = new JButton("Change color");
      frame.getContentPane().add(BorderLayout.SOUTH, southb);
      southb.addActionListener(new SouthButton());

      frame.add(new DrawPanel());

      frame.setVisible(true);
     }

     class EastButton implements ActionListener {
      public void actionPerformed(ActionEvent event1) {  
       eastb.setText("Ouch!");
      }
     }

     class SouthButton implements ActionListener {
      public void actionPerformed(ActionEvent event2) {
       frame.repaint();
      }
     }

    }

    class DrawPanel extends JPanel {
     public void paintComponent(Graphics g) {

      int red = (int) (Math.random()*255);
      int green = (int) (Math.random()*255);
      int blue = (int) (Math.random()*255); 

      Color randomizer = new Color(red, green, blue);
      g.setColor(randomizer);

      int x = getWidth()/2;
      int y = getHeight()/2;
      int r = x/2;
      int d = 2*r;

      g.fillOval(x-r, y-r, d, d);
     }
    }

\\

1 Ответ

1 голос
/ 18 апреля 2020

Я только сказал ему, чтобы вызвать setText () при нажатии.

При изменении свойства компонента возможно изменение размера компонента. Если размер изменяется, возможно, это повлияет на макет всех компонентов, поэтому вызывается менеджер макета. После вызова диспетчера макета для всех элементов может быть настроен размер / расположение, поэтому все компоненты на панели перекрашиваются.

Этот процесс выполняется автоматически c, что приводит к проблеме с вашим кодом.

Метод рисования должен быть только для рисования. Вы НЕ должны изменять свойства своего класса в методе рисования.

  int red = (int) (Math.random()*255);
  int green = (int) (Math.random()*255);
  int blue = (int) (Math.random()*255); 

  Color randomizer = new Color(red, green, blue);

Приведенный выше код НЕ должен быть в вашем методе рисования. Опять же, вы не можете контролировать, когда вызывается метод paintComponent (). Таким образом, ваш случайный цвет будет генерироваться каждый раз, когда Swing решит, что панель должна быть перекрашена.

Вместо этого вам необходимо:

  1. добавить «randomizer» как переменную экземпляра в вашем классе.
  2. добавьте метод, подобный generateRandomColor(), чтобы установить значение для этой переменной, которое вы могли бы вызывать в конструкторе вашего класса или вызывать после создания пользовательской панели.
  3. изменить логи рисования c для ссылки на эту переменную "randomizer".
...