有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

windows为什么这个Java图形不能在OS X中显示?

在课堂上,我得到了一些演示代码,这些代码在实验室的Windows电脑上运行,但在2010年的MacBook上使用Sierra的方式不同

做出Java Graphics Not Displaying In OS X中建议的更改并没有解决我的问题。我还尝试过调整窗口大小,这会稍微改变动画大小——调整大小后,它会间歇性弹出。如果我增加线程。sleep()时间并调整大小,动画会有所改善,但仍然是不稳定的

为什么代码在我的MacBook上不起作用,我怎样才能让它起作用

原始代码(适用于Windows 10,但不适用于我的Mac):

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

public class GraphicsTestA extends JFrame{
   int x1 = 60;
   int x2 = 150;
    public static void main(String [] args){
        GraphicsTestA gta = new GraphicsTestA();
      gta.animate();
    }

   private void animate()
   {
      while(true)
      {
         for(int i=0; i <100; i ++)
         {
            x1 = x1 + 1;
            x2 = x2 - 1;
            try
            {
               Thread.sleep(100);
            }
            catch(Exception ex)
            {}
            repaint();
         }

         x1 = 60;
         x2 = 150;
      }
   }
    public GraphicsTestA() {
        setSize(200,200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        this.validate();
    }

    public void paint(Graphics g) {
        super.paint(g);

      g.drawString("Hello World",80,80);
      g.drawLine(x1,60,x2,150);
        g.drawRect(100,40,30,30);

    }
}

共 (1) 个答案

  1. # 1 楼答案

    在swing中,不应该在swing线程之外调用swing内容。Windows可以让你摆脱一些污点,但mac上的Java对此非常挑剔

    在这段代码中,构造函数进行swing调用,但它是从主线程调用的。您可以尝试将其拆分,以便Swing线程调用构造函数,但动画方法存在问题

    Swing线程不应该调用animate方法,因为它正在调用sleep(),而暂停Swing线程是个坏主意™. 然而,它也在调用repaint(),这是一个swing调用,需要由swing线程调用

    我建议您使用EventQueue.invokeLater构建窗口,然后找出如何使用Swing Workers或其他适当的机制来制作动画