5

解決できないパネル レイアウトの問題があります。次のコードがあります。

public class Test extends ApplicationFrame {
    public Test(String title) {
        super(title);

        JPanel jpanel = new JPanel();
        jpanel.setPreferredSize(new Dimension(100 * 2, 300));
        jpanel.setBackground(new Color(0xFF0000));

        JScrollPane scrollPane = new JScrollPane(jpanel);
        scrollPane.setBackground(new Color(0xFF0000));
        scrollPane.getViewport().setPreferredSize(new Dimension(100 * 2, 300));

        this.add(scrollPane, BorderLayout.WEST);
        this.setPreferredSize(new Dimension(500, 500));
    }

    public static void main(String args[]) {
        Test test = new Test("Layout Test");
        test.pack();
        RefineryUtilities.centerFrameOnScreen(test);
        test.setVisible(true);
    }
}

次のレイアウトを作成します。

ここに画像の説明を入力

ウィンドウの右側をドラッグして赤色のJPanelとに移動するとJScrollPane、水平スクロール バーが に表示されるようにしJScrollPaneます。しかし、現在、ウィンドウは水平スクロール バーを表示せずに縮小するだけです。これは可能ですか?

BorderLayout.WESTウィンドウ全体を埋めるのに十分な大きさのチャートがない場合に、JFreeChart が伸びないようにすることが私の使用例であるため、を維持したいと思います。

4

2 に答える 2

7

を使用しない理由はたくさんありますsetPreferredSize()が、ここで重要なのは、望ましい結果が囲まれたコンポーネントの望ましいサイズに依存することです。特に、

  • ChartPanelFlowLayoutによって指定されたデフォルトがありますJPanelが、チャートはこれを無視し、使用可能なスペースを埋めるように調整します。オーバーライドgetPreferredSize()して、必要な初期ジオメトリを選択できます。

  • のスクロール バーはJScrollPane、ビューポートのサイズがコンテンツのサイズより小さい場合にのみ表示されます。BorderLayout.WEST変更しBorderLayout.EASTないため、スクロール バーは表示されません。

呼び出すと、 pack()Windowサブコンポーネントの優先サイズとレイアウトに合わせてサイズが変更されます。」pack()以下の例では、スクロール バーを表示するために、フレームのサイズを人為的に縮小しています。GridLayout2 つのパネルのサイズが等しくなります。フレームのサイズを変更して効果を確認します。

ChartPanel補遺:を固定サイズにしたい場合は、 JPanel;に追加します。デフォルトでFlowLayoutは優先サイズが使用されます。

画像

public class ChartPanelTest {

    private static final int N = 64;
    private static final int SIZE = 400;
    private static final Random random = new Random();

    private static XYDataset createDataset() {

        final TimeSeries series = new TimeSeries("Random Data");
        Day current = new Day();
        for (int i = 0; i < N; i++) {
            series.add(current, random.nextGaussian());
            current = (Day) current.next();
        }
        return new TimeSeriesCollection(series);
    }

    private static JFreeChart createChart(final XYDataset dataset) {
        JFreeChart chart = ChartFactory.createTimeSeriesChart(
            "Test", "Day", "Value", dataset, false, false, false);
        return chart;
    }

    public static void main(String[] args) {

        JFrame f = new JFrame();
        f.setLayout(new GridLayout(1, 0));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JFreeChart chart = createChart(createDataset());
        f.add(new JScrollPane(new JPanel() {

            {
                setBackground(Color.red);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(SIZE, SIZE);
            }
        }));
        f.add(new ChartPanel(chart) {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(SIZE, SIZE);
            }
        });
        f.pack();
        f.setSize(2 * (SIZE - N), SIZE - N);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
于 2012-11-07T00:26:28.343 に答える
0

それはできます。3 つの JPanel を宣言できます。1 つの JPanel は、BorderLayout を備えた contentPanel です。スクロールバーが必要な JPanel の preferredSize と maximumSize に設定し、jscroolpane とその仕上げを作成します。擬似コード:

JPanel contentPanel = new JPanel(new BorderLayuout());
JPanel jpanel1 = new JPanel(layout--);
JPanel jpanel2 = new JPanel(layout--);
jpanel2.setPreferredSize(..);
jpanel2.setMaximuSize(..);
JScrollPane jsp = new JScroolPane(jpanel2);
contentPanel.add(jpanel1,BorderLayout.WEST);
contentPanel.add(jsp,BorderLayout.CENTER);
this.getContentPane().add(contentPanel);

私の例では、スクロールバーは中央にあります。変更したい場合

contentPanel.add(jsp,BorderLayout.WEST);
contentPanel.add(jpanel1,BorderLayout.CENTER);
于 2012-11-07T00:07:31.913 に答える