Почему мой метод Java repaint () не работает? - PullRequest
0 голосов
/ 25 февраля 2020

Хейо, для домашней работы в колледже мне нужно нарисовать несколько изображений и поспорить с ними, но я застрял даже при рисовании изображений (или, в данном случае, иконок). Я хочу нарисовать НИЧЕГО (вот почему у меня есть метод drawLine, просто чтобы проверить его) на данный момент на одном из многих JPanels, но мой метод repaint () не вызывает мой метод paintComponent, почему?

import java.awt.*;  
import javax.swing.*;  
import java.lang.Math; 


public class Races{
   private int numberOfRacers;

   public Races(int numberOfRacers){
      this.numberOfRacers = numberOfRacers;
      JFrame frame = new JFrame("Races - Name Surname");

      Icon icon = new ImageIcon("races.jpg");
      frame.setLayout(new GridLayout(numberOfRacers, 1));
      frame.setSize(icon.getIconWidth()*20, (icon.getIconWidth()*2)*numberOfRacers);
      frame.setVisible(true);
      frame.setLocationRelativeTo(null);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      try{
         Thread.sleep(1000);  // Sleeping 1 sec 
         System.out.println("Sleeping one second for the user!");
      }catch(InterruptedException ie){
         System.out.println(ie);
      }


      for(int i = 0; i < numberOfRacers; i++){
         innerRacer racer = new innerRacer();
         frame.add(racer.panel);
         //JLabel iconLabel = new JLabel(icon);
         //iconLabel.setHorizontalAlignment(JLabel.LEFT);
         //panel.add(iconLabel);
         Thread t = new Thread(racer);
         t.start();

      }
   }

   public static void main(String args[]){

      if(args.length > 0 && Integer.parseInt(args[0]) > 0 && Integer.parseInt(args[0]) < 100){
         Races races = new Races(Integer.parseInt(args[0]));   // From command line number of racers
         System.out.println("Number of racers: " + args[0]);
      }else{
         Races races = new Races(5);      // Default number of racers
         System.out.println("Number of racers: 5");
      }
   }

   public class innerRacer extends JPanel implements Runnable{ 
      JPanel panel;
      Icon icon;
      public innerRacer(){
         panel = new JPanel();
         panel.setBackground(Color.WHITE);

         icon = new ImageIcon("races.jpg");
      } //end of innerRacer constructor

      @Override
         public void run(){
            repaint();     
            System.out.println("TEST");  
         }
     @Override
     public void paintComponent(Graphics g){
         super.paintComponent(g);
         g.drawLine(10, 20, 30, 40);
         System.out.println("Why is this one not called?");
         icon.paintIcon(panel, g, 0, 0);
     } 

   } // end of innerRacer class
} //end of Races class

Заранее спасибо.

1 Ответ

2 голосов
/ 25 февраля 2020

Вы добавили JPanel, который содержит innerRacer, а не JPanel, который innerRacer есть.

Изменение:

     frame.add(racer.panel);

на:

     frame.add(racer);

Также я вижу, что вы добавляете компоненты к фрейму после установки его в видимый. Когда вы делаете это в AWT / Swing, они не будут автоматически размечены или раскрашены. Вы должны будете следовать со строкой:

  frame.revalidate(); 

В качестве альтернативы, линия setVisible может быть перемещена вниз.

Как общие примечания:

  • Это хорошая идея придерживаться Java соглашений об именах - всегда начальные заглавные буквы для типов.
  • JPanel panel; в innerRacer могут быть удалены.
  • Компоненты Swing всегда должны быть доступны из AWT Поток отправки событий (EDT). Используйте java.awt.EventQueue.invokeLater.
  • Множество уроков предлагают переопределить JPanel без добавления каких-либо компонентов, если вы хотите что-то нарисовать. Это происходит потому, что по умолчанию он непрозрачный. Ни документы API для JPanel, ни даже исходный код OpenJDK не упоминают о непрозрачности. Действительно, это не гарантировано. Это просто взломать. Предпочитают setOpaque(true) сделать компонент непрозрачным.
  • Наличие класса расширяет другой и реализует интерфейс (или реализует несколько интерфейсов (не маркеров, Comparable, и т. Д. c)), не очень хорошо. Используйте лямбда-метод, ссылку на метод, внутренний класс или просто другой внешний класс в зависимости от ситуации.
...