0

JFrame のサイズを変更すると、テーブル (より具体的には scrollPane) が小さな四角形になります (同じままですが、高さは 5 ~ 10 ピクセルに近くなります)。

また、JFrame には特定の高さのしきい値があることに気付きました。JFrame の高さがこれを下回ると、すべての GridBagLayouts が正しく動作します (たとえば、すべてのパネルの幅と高さが正しくなります)。高さがこのしきい値よりも高い場合、JFrame の高さを減らすと、両方の右側のパネルの幅が追加され、rightTopPanel は rightBottomPanel よりもはるかに速く高さが失われます。

しきい値は、rightTopPanel が最小の高さ (約 5 ~ 10 ピクセル) になるポイントのようです。

JPanel panel = new JPanel(new GridBagLayout());

JPanel rightTopPanel = new JPanel(new GridBagLayout());
panel.add(rightTopPanel, Helper.createGridBagConstraints(1, 0, 1, 1, 0.5, 0.5, GridBagConstraints.BOTH));

JPanel rightBottomPanel = new JPanel(new GridLayout(1, 1));

tableModel = new DefaultTableModel(0, 2);
JTable table = new JTable(tableModel);

JScrollPane scrollPane = new JScrollPane(table);
rightBottomPanel.add(scrollPane);

panel.add(rightBottomPanel, Helper.createGridBagConstraints(1, 1, 1, 1, 0.5, 0.5, GridBagConstraints.BOTH));

JPanel leftPanel = new JPanel();
panel.add(leftPanel, Helper.createGridBagConstraints(0, 0, 1, 2, 0.5, 1.0));

add(panel);

Helper.createGridBagConstraints は、GridBagConstraints を作成するための単なるヘルパー メソッドであり、多数の「オプション」パラメーターがあります。

GridBagConstraints createGridBagConstraints(int gridx, int gridy)
GridBagConstraints createGridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight)
GridBagConstraints createGridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty)
GridBagConstraints createGridBagConstraints(int gridx, int gridy, int gridwidth, int gridheight, double weightx, double weighty, int fill)

編集:これは JScrollPane 内の問題のようです。追加しないと、残りのパネルのサイズが正しく変更されます。

編集2:これまでのところ、私の問題が何であるかを誰も理解していないため、スクリーンショットを次に示します: http://img155.imageshack.us/img155/8847/badgridbaglayout1.png

http://img17.imageshack.us/img17/8779/badgridbaglayout2.png

http://img28.imageshack.us/img28/9336/badgridbaglayout3.png

4

4 に答える 4

3

テーブル (より具体的には scrollPane) は小さな長方形に押しつぶされます (同じままですが、高さは 5 ~ 10 ピクセルに近くなります)。

AGridBagLayoutは、コンポーネントを適切なサイズでペイントしようとします。フレームが縮小すると、コンポーネントは「最小サイズ」でペイントされます。そのため、コンポーネントの最小サイズが 0 の場合、小さな長方形としてのみ表示されることがあります。

スクロール ペインの最小サイズを優先サイズに設定してみるか、使用する制約を使用してこの動作を制御することができます。

詳細については、 GridBagLayout の使用方法に関する Swing チュートリアルのセクションを参照してください。

それでも問題が解決しない場合は、問題を示すSSCCEを投稿してください。

于 2011-07-04T15:06:09.370 に答える
1

唯一の解決策は、Swingの組み込みレイアウトが適切に実装されていないため、レイアウトをまったく使用せず、コンポーネントを手動で配置/サイズ変更することです。

于 2011-07-07T12:01:37.693 に答える
1

私はこのプログラムを作成しました -

package pkg;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TestFrame extends JFrame {
    public TestFrame() {
        JPanel panel = new JPanel(new GridBagLayout());

        JPanel rightTopPanel = new JPanel(new GridBagLayout());
        panel.add(rightTopPanel, new GridBagConstraints(1, 0, 1, 1, 0.5, 0.5, GridBagConstraints.NORTH, 
                GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

        JPanel rightBottomPanel = new JPanel(new GridLayout(1, 1));

        DefaultTableModel tableModel = new DefaultTableModel(0, 2);
        JTable table = new JTable(tableModel);

        JScrollPane scrollPane = new JScrollPane(table);
        rightBottomPanel.add(scrollPane);

        panel.add(rightBottomPanel, new GridBagConstraints(1, 1, 1, 1, 0.5, 0.5, GridBagConstraints.NORTH, 
                GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

        JPanel leftPanel = new JPanel();
        panel.add(leftPanel, new GridBagConstraints(0, 0, 1, 2, 0.5, 1.0, GridBagConstraints.NORTH, 
                GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));

        add(panel);
        setSize(800, 600);
        setVisible(true);
    }

    public static void main(String[] args) {
        new TestFrame();
    }
}

そしてそれはうまくいくようです。Help.createGridBagConstraints() メソッドに何を入れていますか。問題の所在が見えてきそうです。

于 2011-07-04T13:06:35.723 に答える
1

GridBagConstraints に ipadx と ipady の値を指定してみてください。

于 2011-07-04T12:43:12.987 に答える