0

Javaアプリケーションの一部としてダイアログを作成しています。groovyのswingBuilderを使用していますが、JDialogをパックしようとすると問題が発生します。以下のコードを参照してください。

import groovy.swing.SwingBuilder
import javax.swing.*

swing = new SwingBuilder()

swing.edt{
    frame(id: 'mainFrame', title: 'Test', size: [200,200], visible: true, locationRelativeTo: null, resizable: false){
    panel{
        button('Click me', actionPerformed: {createAssessmentCategoryDialog()})
        }
    }
}

public JPanel createAssessmentCategoryPanel(){
    swing.panel(id: 'assessmentCategoryPanel'){
        panel{
            panel(layout: gridLayout(rows:2, cols:2, hgap:4, vgap:4)){
                label("Category Name", horizontalAlignment: JLabel.RIGHT)
                textField(id: 'categoryName', columns: 12)
                button('Save & add another', actionPerformed:{saveAssessmentCategoryInfo()}).toolTipText = 'Saves and clears field'
                button('Close', actionPerformed:{assessmentCategoryDialog.visible = false}).toolTipText = 'Closes dialog without saving'
            }
        }
    }
    return swing.assessmentCategoryPanel
}

public void createAssessmentCategoryDialog(){
    assessmentCategoryDialog = new JDialog(swing.mainFrame, "Add Assessment Category", true)
    assessmentCategoryDialog.resizable = false
    assessmentCategoryDialog.defaultCloseOperation = JDialog.DISPOSE_ON_CLOSE
    assessmentCategoryDialog.contentPane.add(createAssessmentCategoryPanel())
    assessmentCategoryDialog.pack()
    assessmentCategoryDialog.locationRelativeTo = swing.mainFrame
    assessmentCategoryDialog.visible = true
}

このコードをGroovyコンソールに貼り付けると、正常に実行されるはずです。[クリックしてください]ボタンをクリックした後、ダイアログの下の余分なスペースに注意してください。

つまり、ラベル、textField、および2つのボタンを持つグリッドレイアウトです。正常に表示されますが、ダイアログをパックしようとすると問題が発生します。水平方向にうまくパックされますが、下部に余分なスペース(GridLayoutの余分な行のようなもの)があります。ダイアログが奇妙に見えるようになります。この問題をGridLayoutに絞り込みました。これは、コンポーネントの行を1つだけ追加すると、問題なくパックされるためです。グリッドを完全に削除し、他のランダムなコンポーネントを追加すると、正常にパックされます。別のレイアウトマネージャーを試すことができることはわかっていますが、GridBagのように、コードが多すぎなくてもGridLayoutはうまく機能します。したがって、他に解決策がない場合を除いて、私は実際にはGridLayoutに固執したいと思います。

JDialogでsetSize()メソッドを使用すると、ダイアログのサイズが変更されますが、テーマやプラットフォームが異なると、パフォーマンスが低下します。プラットフォームのサイズを調整するには、pack()を使用したいと思います。よろしくお願いします。

4

2 に答える 2

1

chubbardが示唆しているように、私はGridLayoutの使用をやめ、TableLayoutを使用しました。ライブラリは無料で、以下のURLにいくつかの優れたドキュメントがあります。

http://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/

慣れるまで少し時間がかかりましたが、このレイアウト管理でほぼすべてのレイアウトを実現できるようです。jar、ドキュメント、およびAPIについては、上記のURLを参照してください。再びチャバードに感謝します。

また、groovyは、特別な統合なしでクラスを使用できます。スイングを使用してUIを実行することに慣れている限り、UIコンポーネント、レイアウトなどをGroovyコードに変換するのはかなり簡単です。だから私はそれとその罰金をしました。注:groovyに変換できない場合でも、.groovyファイルに通常のJavaを書き込むことはまったく問題ありません。GroovyはあなたにGroovyのやり方で物事をすることを強制しません:)

于 2011-10-06T14:15:16.973 に答える
1

GridLayout の使用を停止し、別のレイアウトに切り替えます。GridLayout は各セルのサイズが等しいため、フットボールのバットと同じくらい便利です。ですから、新しいスポーツを作りたくない限り、それが役に立つとは思えません。GridBagLayout を使用できますが、イライラするほど冗長です。TableLayout を取得することをお勧めします。

http://java.sun.com/products/jfc/tsc/articles/tablelayout/

これは、はるかに生産性の高い LayoutManager です。どの Sun LayoutManager よりもはるかに便利です。Groovy でどのように動作するかはわかりませんが、Groovy は特別な統合を開発する必要なくこれらのクラスを使用できるようです。

あなたの pack() ステートメントは設計どおりに機能していると思いますが、それは LayoutManager の選択が悪いだけです。これを修正すれば、 setSize() も同様に機能することがわかるでしょう。pack() が実際に行うことは、コンポーネントの適切なサイズを計算し、ダイアログのサイズをそれに設定することだけです。ただし、JDialog のサイズを設定すると、LayoutManager がコンポーネントにスペースを配分する方法に従って、コンポーネントが単純にレイアウトされます。個々のコンポーネントがダイアログのサイズを決定するボトムアップと、ダイアログがここでサイズを決定し、ボトムコンポーネントがそれらの大きさを把握するトップダウンとの間の違いの並べ替え。

お楽しみください: http://madbean.com/anim/totallygridbag/

于 2011-10-06T04:29:56.647 に答える