繁体   English   中英

BorderLayout无法正确显示

[英]BorderLayout doesn't show correctly

我想要一个JFrame,左边和右边有一个边框,颜色为黑色,宽度为withfOfJFrame / 10。

现在,我尝试它看起来像这样:

JFrame f = new JFrame();
f.setSize(800, 600);
f.setLayout(new BorderLayout());

JPanel leftBorder = new JPanel();
JPanel rightBorder = new JPanel();
leftBorder.setBackground(Color.black);
rightBorder.setBackground(Color.black);
leftBorder.setSize(f.getWidth()/10, f.getHeight());
rightBorder.setSize(f.getWidth()/10, f.getHeight());
JPanel center = new JPanel();
center.setBackground(Color.red);

f.add(leftBorder, BorderLayout.WEST);
f.add(center, BorderLayout.CENTER);
f.add(rightBorder, BorderLayout.EAST);    
f.setVisible(true);

这会在左侧和右侧添加黑色边框,但该边框具有固定大小,并且在调整窗口大小时不会重新计算。 大小甚至不是800的1/10(JFrame的起始宽度)。

我究竟做错了什么? 或者甚至有更好的方法来做到这一点?

ComponentListener适用于此。

附录: Flank面板需要显式revalidate()以响应任何大小更改。

图片

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/a/14588506/230513 */
public class Test {

    private static final int W = 320;
    private static final Center center = new Center();

    private static class Center extends JPanel {

        public Center() {
            setBackground(Color.red);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(W, 3 * W / 4);
        }
    };

    private static class Flank extends JPanel {

        private Dimension d = new Dimension(W / 10, 0);

        public Flank() {
            setBackground(Color.black);
            Test.center.addComponentListener(new ComponentAdapter() {

                @Override
                public void componentResized(ComponentEvent e) {
                    d = new Dimension(e.getComponent().getWidth() / 10, 0);
                    revalidate();
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return d;
        }
    }

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.add(new Flank(), BorderLayout.WEST);
        f.add(center, BorderLayout.CENTER);
        f.add(new Flank(), BorderLayout.EAST);

        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}

您可以使用GridBagLayout和适当的权重来获得所需的结果:

public class Snippet {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                JPanel leftBorder = new JPanel();
                JPanel rightBorder = new JPanel();
                leftBorder.setBackground(Color.black);
                rightBorder.setBackground(Color.black);

                JPanel center = new JPanel();
                center.setBackground(Color.red);

                f.setLayout(new GridBagLayout());

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.fill = GridBagConstraints.BOTH;
                gbc.weighty = 1.0;
                gbc.gridy = 0;
                gbc.gridwidth = 1;
                gbc.gridheight = 1;

                gbc.gridx = 0;
                gbc.weightx = 0.1;
                f.add(leftBorder, gbc);

                gbc.gridx = 1;
                gbc.weightx = 0.8;
                f.add(center, gbc);

                gbc.gridx = 2;
                gbc.weightx = 0.1;
                f.add(rightBorder, gbc);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM