2017-10-05 7 views
2

これは私自身のアニメーションを作成するためにこのtutorialをフォローしています。それを実行すると、Windows上ではうまくいきますが、マウスがアプリケーション上を移動している場合、Ubuntu 17.04窓。そうでないと "フィット感とスタート"のように働く(私は良い翻訳だと思う)。 私のJavaスイングアニメーションをLinuxでスムーズにする

import javax.swing.JFrame; 
public class test { 
public static void main(String [] args) { 
    Window window = new Window("Animation"); 

} 

} 

は私にいくつかのアイデアを与えることができるかもしれいずれかに事前にありがとう:

import javax.swing.Box; 
import javax.swing.BoxLayout; 
import java.awt.Color; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Window extends JFrame { 

private Panel pan = new Panel(); 
private JButton play = new JButton("play"); 
private JButton pause = new JButton("pause"); 

public Window(String titre) { 

    this.setTitle(titre); 
    this.setSize(900, 600); 
    this.setLocationRelativeTo(null); 
    this.setAlwaysOnTop(true); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Box b1 = Box.createHorizontalBox(); 
    b1.add(play); 
    b1.add(pause); 

    Box b2 = Box.createVerticalBox(); 
    b2.add(b1); 
    this.setContentPane(pan); 
    this.getContentPane().add(b2); 
    this.setVisible(true); 
    this.go(); 

} 

private void go() { 
    // Les coordonnées de départ de notre rond 
    int x = pan.getPosX(), y = pan.getPosY(); 
    // Le booléen pour savoir si l'on recule ou non sur l'axe x 
    boolean backX = false; 
    // Le booléen pour savoir si l'on recule ou non sur l'axe y 
    boolean backY = false; 

    // Dans cet exemple, j'utilise une boucle while 
    // Vous verrez qu'elle fonctionne très bien 
    while (true) { 
     // Si la coordonnée x est inférieure à 1, on avance 
     if (x < 1) 
      backX = false; 

     // Si la coordonnée x est supérieure à la taille du Panneau moins la taille du 
     // rond, on recule 
     if (x > pan.getWidth() - 50) 
      backX = true; 

     // Idem pour l'axe y 
     if (y < 1) 
      backY = false; 
     if (y > pan.getHeight() - 50) 
      backY = true; 

     // Si on avance, on incrémente la coordonnée 
     // backX est un booléen, donc !backX revient à écrire 
     // if (backX == false) 
     if (!backX) 
      pan.setPosX(++x); 

     // Sinon, on décrémente 
     else 
      pan.setPosX(--x); 

     // Idem pour l'axe Y 
     if (!backY) 
      pan.setPosY(++y); 
     else 
      pan.setPosY(--y); 

     // On redessine notre Panneau 
     pan.repaint(); 

     // Comme on dit : la pause s'impose ! Ici, trois millièmes de seconde 
     try { 
      Thread.sleep(2); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

} 

secondeクラス:

import javax.swing.JPanel; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

public class Panel extends JPanel { 

private int posX = -50; 
private int posY = -50; 

public void paintComponent(Graphics g) { 
    g.setColor(Color.WHITE); 
    g.fillRect(0, 0, this.getWidth(), this.getHeight()); 
    g.setColor(Color.red); 
    g.fillOval(posX, posY, 50, 50); 
} 

public int getPosX() { 
    return posX; 
} 

public void setPosX(int posX) { 
    this.posX = posX; 
} 

public int getPosY() { 
    return posY; 
} 

public void setPosY(int posY) { 
    this.posY = posY; 
} 
} 

とメイン ここに私のコードです:)

+0

Windowsがアクティブでない場合、おそらくリソースを節約するリソースがあるでしょうか? – Dinh

+0

よく、私はモニターシステムと高リソースを置くと同じことをします。私がマウスをウィンドウの上に置いていなくてもうまくいけば、それはうまく動作します。 –

+0

'paintComponent'メソッドが別のスレッドで変更できるプロパティに依存していることを気にしています。描画プロセスでは、代わりに 'BufferStrategy'を使うことを検討するべきです – MadProgrammer

答えて

2

お試しください。

Toolkit.getDefaultToolkit()。sync();

あなたは)(

pan.repaintを実行した後、

+0

それは今すぐ素晴らしい作品をありがとう!しかし、なぜ? –

+0

@DaniSanzこれは非常に幅広い質問です。まず、[JavaDocs](https://docs.oracle.com/javase/8/docs/api/java/awt/Toolkit.html#sync-- ) - * "この方法は、ディスプレイが最新であることを保証します。アニメーションには便利です。 "*、また、[Painting in Swing](http://www.oracle.com/technetwork/java/painting-140037.html)を参照することをお勧めします。ペイントプロセスが実際に動作する – MadProgrammer

+0

linuxのグラフィックススケジューリングに問題があり、何らかの理由でそれが遅くなり、遅くなることを意味します。 コールは貴重なCPUサイクルを消費しますので、実際にはかなりのものがありますので、System.getProperty( "os.name ")あなたがそれを使用する必要があるかどうかを判断してください。 – Dinh

関連する問題