2016-04-01 6 views
1

processingスケッチを含むJPanelを含むJFrameがあります。 panelJFrameのコンポーネントは、サイズ変更(時には)後にのみ正しい位置にあります

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import processing.core.PApplet; 

public class TestCase { 
    public static void main(String[] args) { 
     ProcessingFrame pFrame = new ProcessingFrame(); 
     pFrame.setVisible(true); 
    } 
} 

@SuppressWarnings("serial") 
public class ProcessingFrame extends JFrame{  
    public ProcessingFrame(){ 
     this.setSize(600, 400); 
     this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     ProcessingSketch pSketch = new ProcessingSketch(); 
     panel.add(pSketch); 
     this.add(panel); 
     pSketch.init(); 
     this.setVisible(true); 
    } 
} 

public class ProcessingSketch extends PApplet{ 
    public ProcessingSketch(){ 
     //... 
    } 
    public void setup(){ 
     size(600, 400); 
     background(200); 
    } 
    public void draw(){ 
     rect(250,100,100,200); 
    } 
} 

あまりにも頻繁に(約50%)、および/またはsketchは、適切な場所にレンダリングされていません。コードは次のようになります。場合によっては、フレームサイズの約半分が右にずれていることもあります。フレームのスケッチの底だけを見ることもあります。

フレームをマウスでサイズ変更した後、すべてが正常に見えます。私は​​にJFrameを設定したいと思いますが、すべてを配置するためにウィンドウのサイズを変更する方法はありません。ここで提案されているよう

  • JFrame.repaint()

    これは私がそれを解決しようとしたものですJava items appear only after the window is resize。 - 無効。

  • 私は手でウィンドウのサイズを変更してから​​に変更することができたと思っていました。この質問の回答に続いて:Modifying a JFrame from within a Listener。しかし、私はdispose JFrameにしなければならないので、処理スケッチはクラッシュします。

他のアイデアはありますか?

+1

'コードは次のようになります。' - 私たちを助けません。問題を示す適切な[SSCCE](http://sscce.org/)を投稿してください。 – camickr

+0

@camickrありがとう、私はテストケースを作成しようとしました。 – 7morgen

+0

申し訳ありませんが、サードパーティのパッケージが何をしているのか分かりません。レイアウトに影響しているのかもしれません。 SSCCEはJDKクラスに基づいている必要があります。 – camickr

答えて

1

これはスレッドの問題のようです。処理には独自のアニメーションスレッドが使用されているため、問題が発生しているのは本当に驚きではありません。また、散発的ではありません。それがスレッドの性質です。

実際、Processingの最新バージョンでは、このようにSwingアプリケーションにProcessingスケッチを追加する機能が削除されました。この問題を本当に解決したい場合は、最新バージョンのProcessingに更新してJavaライブラリとして使用する必要があります。それ以上の作業ですが、この古い方法を続けるよりも正しいです。

しかし私が知りたいのはあなたが聞きたいことではないので、最初に試してみるのはJFrame.revalidate()です。処理スケッチが初期化された後でこれを行う必要があります。これは前述のスレッドの問題では難しいかもしれません。あなたはそれを何らかの遅延の中に置かなければならないかもしれないし、あるいはsetup()の機能からそれを行うかもしれません。

これでうまくいかない場合は、少し遅れてプログラムでJFrameのサイズを変更することができます。それはかなりハックアップですが、やはり、 "正しい"方法は、あなたの処理を更新し、古い方法を埋め込むことを止めることです。

+0

ありがとうございます! 'JFrame.revaildate()'はうまくいきます。最後のコマンドを 'setup()'に入れます。実際、処理3への変更は私のwish-todoリストの最大のポイントの1つです。 – 7morgen