先让大家看下图这张用的是layout是BorderLayout,中间的特别大,两边的特别小
有3个JPanel,shortcutsPane、checkoutPane、中间的centerPane
下面是我想要的样子不知道怎么实现,是不是有什么方法可以设置JPanel所占的百分比,这样可以随窗口的变化而变化
同时我的shortcutsPane用的GridLayout,高度特别高,我想要三个pane的高度都跟中间的一样,需要如何处理
请直接

解决方案 »

  1.   

    TableLayout可以实现你的要求,但是这个包得自己下载
      

  2.   

    TableLayout,我这能用这个类,怎么个使用方法,请明示
      

  3.   

    一个例子import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;import layout.TableLayout;@SuppressWarnings("serial")
    public class TypicalGui extends JFrame {    public TypicalGui() {
            super("Typical Gui");        double b = 5;
            double f = TableLayout.FILL;
            double p = TableLayout.PREFERRED;
            double[][] size = { { b, f, 5, p, 5, p, b }, { p, b, f, b, p, b } };
            TableLayout layout = new TableLayout(size);
            Container pane = getContentPane();
            pane.setLayout(layout);        addMenu(pane);
            addCommandButtons(pane, layout);
            addColorBoxes(pane, layout);
            addTextArea(pane, layout);        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(600, 500);
            setAlwaysOnTop(true);
            setLocationRelativeTo(null);
            setVisible(true);
        }    public void addMenu(Container pane) {
            JMenuBar menuBar = new JMenuBar();
            String[] menuText = { "File", "Edit", "View", "Help" };
            String[][] itemText = { { "New", "Open", "Save", "Print" }, { "Cut", "Copy", "Paste" },
                    { "Zoom in", "Zoom out" }, { "About", "Index", "Search" } };        for (int i = 0; i < menuText.length; ++i) {
                JMenu menu = new JMenu(menuText[i]);
                for (int j = 0; j < itemText[i].length; ++j) {
                    JMenuItem item = new JMenuItem(itemText[i][j]);
                    menu.add(item);
                }
                menuBar.add(menu);
            }        pane.add(menuBar, "0,0, 6,0"); // menu bar原来也可以这样加的哦
        }    public void addCommandButtons(Container pane, TableLayout layout) {
            JPanel buttonsPanel = new JPanel();
            pane.add(buttonsPanel, "1,4, 5,4");
            ((FlowLayout) buttonsPanel.getLayout()).setVgap(0);        for (int i = 0; i < 5; ++i) {
                buttonsPanel.add(new JButton("Button " + (i + 1)));
            }
        }    // 直接在插入行添加,不用另外再做面板了
        public void addColorBoxes(Container pane, TableLayout layout) {
            Color[][] colors = { { Color.white, Color.black }, { Color.green, Color.blue },
                    { Color.red, Color.yellow }, { Color.pink, Color.orange },
                    { Color.magenta, Color.cyan } };        for (int i = 0; i < colors.length; ++i) {
                layout.insertRow(2, TableLayout.PREFERRED);
                layout.insertRow(2, 5);            pane.add(new ColorBox(colors[i][0]), "3,3");
                pane.add(new ColorBox(colors[i][1]), "5,3");
            }
            layout.deleteRow(2);
        }    // 因为是在插入行后再增加的,所以要计算行数
        public void addTextArea(Container pane, TableLayout layout) {
            JTextArea area = new JTextArea();
            JScrollPane scroller = new JScrollPane(area);
            int rowNum = layout.getRow().length;
            pane.add(scroller, "1,2, 1," + (rowNum - 4));
        }    public static void main(String[] args) {
            new TypicalGui();
        }
    }@SuppressWarnings("serial")
    class ColorBox extends JComponent {
        private Color color;    public ColorBox(Color color) {
            this.color = color;
        }    @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);        Dimension size = getSize();
            g.setColor(Color.BLACK);
            g.drawRect(0, 0, size.width - 1, size.height - 1);        g.setColor(color);
            g.fillRect(1, 1, size.width - 1, size.height - 1);
        }    @Override
        public Dimension getPreferredSize() {
            return new Dimension(40, 20);
        }
    }