5

画面を2つに分割したいので、EastセクションとWestセクションのあるBorderLayoutを使用しました。サイズ変更に問題がありましたが、最終的に、東と西のパネルでは幅が変更されず、北と南のパネルでは高さが変更されず、中央のパネルで両方が変更されることがわかりました。

ただし、サイズ変更時に幅と高さの両方を変更し、2つのパネルを並べて配置したいと思います。さまざまなレベルのネストを試して動作させましたが、BorderLayoutでは動作しないと思います。

これはデフォルトのレイアウトマネージャーにとっては簡単なようですが、別のレイアウト(BoxLayoutなど)を試して、目的を達成する必要があるかもしれません。

また、私が話している問題を再現するコードもあります(ウィンドウのサイズを変更してみてください)。

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame {

    public static void main(String[] args) {
        JFrame window = new Main();
        window.setVisible(true);
    }

    public Main() {
        JButton east = new JButton("East");
        JButton west = new JButton("West");

        JPanel content = new JPanel();
        content.setLayout(new BorderLayout());

        content.add(east, BorderLayout.EAST);
        content.add(west, BorderLayout.WEST);

        setContentPane(content);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }

}

編集:私は2つの側面が等しくなることを望んでいません、およそ2:1は私が望む比率です。

4

4 に答える 4

8

この場合に使用できるのはGridLayoutです。ここでは、2つJButtonsがサイズ変更に応じてJFrameサイズを変更します。

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                JFrame window = new Main();
                window.setVisible(true);
            }
        });        
    }

    public Main() {
        JButton east = new JButton("East");
        JButton west = new JButton("West");

        JPanel content = new JPanel();
        content.setLayout(new GridLayout(1, 2));

        content.add(east);
        content.add(west);

        setContentPane(content);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }

}

さらに、GUI関連のコードは、メインスレッドからではなく、EDT(イベントディスパッチスレッド)から実行するのが常に最善です。このトピックの詳細については、Swingの並行性をお読みください。

最新の編集:要求されたコメントによる

GridBagLayoutを使用して、指定するサイズを指定します

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                JFrame window = new Main();
                window.setVisible(true);
            }
        });        
    }

    public Main() {
        JPanel east = new JPanel();
        east.setOpaque(true);
        east.setBackground(Color.WHITE);
        JPanel west = new JPanel();
        west.setOpaque(true);
        west.setBackground(Color.BLUE);

        JPanel content = new JPanel();
        content.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 0.3;
        gbc.weighty = 1.0;
        gbc.gridx = 0;
        gbc.gridy = 0;

        content.add(east, gbc);
        gbc.weightx = 0.7;
        gbc.gridx = 1;
        content.add(west, gbc);

        setContentPane(content);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }

}
于 2012-09-04T16:11:22.850 に答える
8

試してみませんかJSplitPane

import javax.swing.*;
import java.awt.*;

public class AppDemo {

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame();
            JButton eastButton = new JButton("East");
            JButton westButton = new JButton("West");
            JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, eastButton, westButton);

            JPanel content = new JPanel();
            content.setLayout(new BorderLayout());
            content.add(splitPane, BorderLayout.CENTER);

            frame.setContentPane(content);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.setPreferredSize(new Dimension(500, 400));
            frame.pack();
            frame.setVisible(true);
        });

    }
}

あなたはこれを得るでしょう:

ここに画像の説明を入力してください

于 2012-09-04T16:19:32.087 に答える
1

BorderLayoutを保持したい場合は、次のオブジェクトのようなものを使用できます。

public class ResizablePanel extends JPanel {

  public ResizablePanel(JComponent body) {

    setLayout(new BorderLayout());
    JButton resize = new JButton();
    resize.setPreferredSize(new Dimension(Integer.MAX_VALUE, 4));
    resize.addMouseMotionListener(new MouseAdapter() {
        public void mouseDragged(MouseEvent e) {
            Dimension preferredSize = ResizablePanel.this.getPreferredSize();
            ResizablePanel.this.setPreferredSize(new Dimension(preferredSize.width, preferredSize.height-e.getY()));
            ResizablePanel.this.revalidate();
        }
    });             
    add(resize, BorderLayout.PAGE_START);
    add(body, BorderLayout.CENTER);
  }
}

次に、サイズを変更する部分をインスタンスでラップしResizablePanelます。細いボタンをドラッグすると、サイズを変更できます。

これは、境界線レイアウトの下部(PAGE_END)部分に配置するパネルの高さを変更するためのコードですが、幅を変更するために変更するのはかなり簡単なはずです。

于 2016-08-11T12:25:47.880 に答える
0

古い投稿に返信して申し訳ありません。私の修正は、引き続きBorderLayoutを使用することですが、コンポーネントのサイズが変更された後、次の行をスローします

getLayout().layoutContainer(this);
于 2020-05-15T02:16:27.440 に答える