java - 为什么我的 Java repaint() 方法不起作用?

标签 java graphics2d

嘿哟,对于我的大学作业,我需要绘制一些图像并进行比赛,但我什至在绘制图像(或在本例中为图标)时陷入困境。我现在想在许多 JPanel 之一上绘制任何东西(这就是为什么我有 drawLine 方法,只是为了测试它),但我的 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

提前致谢。

最佳答案

您已添加 JPanelinnerRacer包含而不是 JPanelinnerRacer是。

更改:

     frame.add(racer.panel);

至:

     frame.add(racer);

我还看到您在将框架设置为可见后向框架添加了组件。当您在 AWT/Swing 中执行此操作时,它们不会自动布局或绘制。您需要遵循以下行:

  frame.revalidate(); 

或者,setVisible该行可以向下移动。

一般说明:

  • 坚持 Java 命名约定是个好主意 - 始终使用类型的初始大写字母。
  • JPanel panel;innerRacer可以删除。
  • Swing 组件应始终从 AWT 事件调度线程 (EDT) 访问。使用java.awt.EventQueue.invokeLater .
  • 很多教程建议覆盖 JPanel如果你想画任何东西,无需添加任何组件。这似乎是因为它默认是不透明的。 JPanel 的 API 文档都没有甚至 OpenJDK 源代码也没有提到不透明性。事实上,这并不能保证。这只是一个黑客行为。喜欢setOpaque(true)使组件不透明。
  • 让一个类扩展另一个类并实现一个接口(interface)(或实现多个接口(interface)(不是标记, Comparable 等))并不是很好。根据需要使用 lambda 方法、方法引用、内部类或另一个外部类。

关于java - 为什么我的 Java repaint() 方法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60401125/

相关文章:

java - 将带空格的字符串转换为json

java - 将鼠标坐标等发送到服务器

java - 您如何处理选择收件人或用户(例如 Google+ 和 Gmail)的问题?

java - BufferedImage 不显示(全黑)但图像可以显示

java - 如何从圆列表中选择圆以从 JFrame 中删除?

java - 如何计算等边三角形的坐标?

java - 如何在java中运行soapUi的特定测试步骤

java - 将模型从 Controller 传递到 View

java - 如何使用java定时器,它在我的程序中不起作用

Java 重绘单个图像