1

スイングアプリケーションで非常に難しい設計上の問題があります。一般的に言えば、表示するaJTableとaがありJLabelます。ラベルはテーブルのすぐ下にあります。

  • これら2つのコンポーネントの高さがしきい値を超えない場合、テーブルとラベルは通常どおり表示されます。次に、これら2つのコンポーネントの高さは、テーブルに入力されるレコードの数が増えるにつれて増加します。
  • これら2つのコンポーネントの高さがしきい値を超える場合、テーブルにスクロールバーがあり、これら2つのコンポーネントの高さがしきい値になります。

このデザインは可能ですか?

4

2 に答える 2

1

これは確かに可能です。スクロールペインの希望のサイズを設定JTableした場所にを置きます。JScrollPane

そして、LayoutManagerこれら2つのコンポーネントを互いに下に置くことができるaを使用します(例:a BorderLayout)。したがって、擬似コードでは

JPanel container = new JPanel( new BorderLayout() );

JTable table=...;
JScrollPane scroll = new JScrollPane( table );
scroll.setPreferredSize( xxx, xxx );
container.add( scroll, BorderLayout.CENTER );

container.add( new JLabel( "my label" ), BorderLayout.SOUTH );

必要に応じて、スクロールペインのスクロールバーポリシーを調整できます

于 2012-09-06T09:37:03.660 に答える
1

Swing レイアウトは、優先サイズが変更されたときに自動的に再レイアウトされません。revalidate を呼び出す必要があります (おそらく、行数が変更されたかどうかをチェックする TableModelListener を使用するのが最適です)。また、好みのサイズに応じてコンポーネントのサイズを変更するレイアウトも必要です。BorderLayout は、境界内のコンポーネントに対してそれを行います (ただし、中央のコンポーネントに対しては行いません。別のマネージャーの場合は、GridBag またはそれ以上の Mig-/Form- が必要です)。またはテーブル (サードパーティ) レイアウト

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TestTableLayout {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JPanel panel = new JPanel(new BorderLayout());
                panel.setPreferredSize(new Dimension(400, 400));

                final DefaultTableModel model = new DefaultTableModel(0, 1);
                JTable table = new JTable(model) {
                    @Override
                    public Dimension getPreferredScrollableViewportSize() {
// view port size should be the same as the preferred size
// limited to the height threshold
                        Dimension size = super.getPreferredSize();
                        size.height = Math.min(size.height, 100);
                        return size;
                    }
                };

                new Timer(1000, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        model.addRow(new Object[] { "Extra row!" });
// trigger a relayout of the panel
                        panel.revalidate();
                        panel.repaint();
                    }
                }).start();

                panel.add(new JScrollPane(table), BorderLayout.PAGE_START);

                JLabel label = new JLabel("my label");
                label.setVerticalAlignment(JLabel.TOP);
                panel.add(label, BorderLayout.CENTER);

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(panel);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}
于 2012-09-06T11:51:50.710 に答える