Java Swingはカードのレイアウトからレイアウトを変更しているようです

StackOverflow https://stackoverflow.com/questions/2800799

質問

私はのJPanelとCardLayoutと、かなり奇妙な症状を持っています。基本的に、私は私が唯一のグリッド上の12個の細胞を保持することができますので、「ページ」などの行為のカードを持っている、と私はカードとして、各ページを表示し、クリック - >と< - ボタンはそれに応じてページを変更(またはそれはアイデアです)。このデータは変更モデルを表しているので、5秒ごとに私は新しいカードが更新された情報を表示する追加されていて、単に古いページを削除しようとしていた。

プログラムの起動時に

基本的に、私は最初のページを構築します:

public OrderSimPanel() {
    super( new CardLayout() );

    // Create the map
    frames = new TreeMap<Integer, String>();

    // Update and draw
    refreshRelevantOrders();
    drawPanel();

    // Set a timer for future updating
    java.util.Timer timer = new java.util.Timer();
    timer.schedule(new UpdateTask(), 5000);

    System.out.println("Constructor DOES get called");
    System.out.println("Panel type is " + this.getLayout().getClass().getName() );
}

どこrefershReleventOrders()単にリストを更新し、drawPanel()はこのようなものです。

private void drawPanel() {
    System.out.println("Panel type is " + this.getLayout().getClass().getName() );

    // Set all old frames to deprecated
    for( Integer k : frames.keySet() ) {
         String o = frames.get( k );
         frames.remove(k);
         k = -k;
         frames.put(k, o);
    }

    // Frame to add to
    JPanel frame = new JPanel( new GridLayout(3,4) );
    int f = 0;

    // Create new cells in groups of 12
    for( int i = 0; i < orders.size(); i++ ) {
        // Pagination powers activate!
        int c = i % 12;
        f = i / 12;

        // Create a new panel if we've run out of room on this one
        if ( c == 0 && i > 0 ) {
            // Add old frame
            String id = new Double( Math.random() ).toString();
            frames.put(f, id);
            add( frame, id );

            // Create new one
            frame = new JPanel( new GridLayout(3,4) );
        }

        // Add the order cell to the panel
        frame.add(new OrderCellPanel( orders.get(i) ));

        i++;
    }

    // Add last frame
    String id = new Double( Math.random() ).toString();
    frames.put(f, id);
    add( frame, id );

    // Set active frame to 0'th frame
    ((CardLayout)(this.getLayout())).show(this, frames.get(0));

    // Erase other frames and from map
    for( Integer k : frames.keySet() ) {
        if( k < 0 ) {
            this.remove(0);
            frames.remove(k);
        }
    }
}
コンストラクタで作成されたタイマータスクがdrawPanel)(refreshRelevantOrders()を呼び出します。このような初期の印刷出力ルックスます:

Panel type is java.awt.CardLayout
Constructor DOES get called
Panel type is java.awt.CardLayout

しかし、時にタイマーが実行は、これが表示されます:

Panel type is javax.swing.GroupLayout

そしてもちろん、drawPanelで鋳造コード()が失敗しました。任意のアイデアをありがとう!

役に立ちましたか?

解決

setLayoutの()メソッドをオーバーライドして、古い/そこに新しいレイアウトクラス名(前またはスーパー実装を呼び出した後)を印刷。この方法で、あなたはあなたのコード・セットの一部GroupLayoutパネルに表示されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top