2

次のようなGUIを表示するJFrameを作成したい:http://i.stack.imgur.com/2POFs.png (画像を埋め込むことは許可されていません)

空白のスペースは同じX次元とY次元であり、ボタンは同じX次元とY次元であり、JTextAreaはフレームの半分です。

public static JFrame frame = new JFrame ("Launcher " + version);
public static GridBagConstraints c = new GridBagConstraints();
public static JTextArea news = new JTextArea();
public static JButton launchGame = new JButton("Launch Game");
public static JButton settings = new JButton("Settings");
public static JButton exitGame = new JButton("Exit");

public static void main(String[] args) 
{
    news.setEditable(false);
    news.setBounds(0, 0, (screenSize.width - 500) / 2,  screenSize.height - 400);
    news.append("                        NEWS:\n");
    news.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.gray, Color.black));

    frame.setLayout(new GridBagLayout());
    frame.setBounds(300, 200, screenSize.width - 500,  screenSize.height - 400);
    c.fill = GridBagConstraints.VERTICAL;
    c.weighty = 0.5;
    c.gridx = 0;
    c.gridy = 0;
    c.gridheight = 3;
    frame.add(news, c);
    frame.setVisible(true);
    c.fill = GridBagConstraints.EAST;
    c.weightx = 0.5;
    c.gridx = 1;
    c.gridheight = 1;
    frame.add(launchGame, c);
    c.gridy = 1;
    frame.add(settings, c);
            c.gridy = 2;
    frame.add(exitGame, c);
}
4

2 に答える 2

2

初めに...

c.fill = GridBagConstraints.EAST;

あなたがやりたいと思うことではありません。塗りつぶしは少なくともHORIZONTAL

第二に...

Insetsコンポーネント間のスペースを調整するために使用できます。

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

public class TestLayout {

    public static void main(String[] args) {    
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new FormPane());
                frame.setSize(500, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected static class FormPane extends JPanel {

        private JTextArea news = new JTextArea();
        private JButton launchGame = new JButton("Launch Game");
        private JButton settings = new JButton("Settings");
        private JButton exitGame = new JButton("Exit");

        public FormPane() {
            setLayout(new GridBagLayout());

            news.setEditable(false);
            news.append("                        NEWS:\n");
            news.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.gray, Color.black));

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.fill = GridBagConstraints.BOTH;
            gbc.weighty = 1;
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridheight = GridBagConstraints.REMAINDER;
            gbc.weightx = 0.25;
            add(news, gbc);

            gbc.insets = new Insets(0, 50, 0, 50);
            gbc.gridheight = 1;
            gbc.gridx++;            
            add(launchGame, gbc);
            gbc.gridy = 1;
            add(settings, gbc);
            gbc.gridy = 2;
            add(exitGame, gbc);
        }
    }
}

JPanelまた、ボタンを独自のコンテナ(のような)に配置し、aを使用GridLayoutしてそれらをレイアウトしてから、上記の提案を使用してテキスト領域とボタンコンテナを配置する傾向があるかもしれません。

これにより、レイアウトをさらに複雑にすることなく、個々のレイアウトのニーズを分離できます...

于 2012-10-08T19:35:25.100 に答える
2

これは、あなたの望むことですか?ボタンの制約に以下を追加/変更しました。

    c.fill = GridBagConstraints.HORIZONTAL;
    c.insets = new Insets(0, 10, 0, 10); // 10 is the marginal

そしてここに完全なコードがあります:

public static void main(String[] args)
{
    news.setEditable(false);
    news.append("                        NEWS:\n");
    news.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.gray, Color.black));

    frame.setLayout(new GridBagLayout());
    c.fill = GridBagConstraints.VERTICAL;
    c.weighty = 0.5;
    c.gridx = 0;
    c.gridy = 0;
    c.gridheight = 3;
    frame.add(news, c);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.insets = new Insets(10, 10, 10, 10); // 10 is the marginal
    c.weightx = 0.5;
    c.gridx = 1;
    c.gridheight = 1;
    frame.add(launchGame, c);
    c.gridy = 1;
    frame.add(settings, c);
    c.gridy = 2;
    frame.add(exitGame, c);

    frame.pack();
    frame.setVisible(true);
}

代わりに使用した同様のレイアウトを次に示しますBoxLayout(作業が簡単だと思います)。

private static JComponent buildButtons() {
    for (JButton button : Arrays.asList(launchGame, settings, exitGame)) {
        button.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
    }

    Box b = Box.createVerticalBox();
    b.add(Box.createVerticalStrut(10));
    b.add(launchGame);
    b.add(Box.createVerticalStrut(10));
    b.add(settings);
    b.add(Box.createVerticalStrut(10));
    b.add(exitGame);
    b.add(Box.createVerticalStrut(10));

    return b;
}

static JComponent buildUI() {
    Box b = Box.createHorizontalBox();
    b.add(news);
    b.add(Box.createHorizontalStrut(10));
    b.add(buildButtons());
    b.add(Box.createHorizontalStrut(10));

    return b;
}

public static void main(String[] args)
{
    news.setEditable(false);
    news.append("                        NEWS:\n");
    news.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.gray, Color.black));

    frame.add(buildUI());
    frame.pack();
    frame.setVisible(true);
}
于 2012-10-08T18:56:42.967 に答える