【问题标题】:How to make a vertical line of buttons from the left side of the frame?如何从框架的左侧制作一条垂直的按钮?
【发布时间】:2019-03-23 14:13:18
【问题描述】:

包含面板的框架,其中按钮位于框架左侧的列中:

我试图用真正的 Java 代码制作这张图片,但失败了。

我找不到这个问题的正确解决方案...

    BorderLayout borderLayout = new BorderLayout();
    GridBagLayout gridBagLayout = new GridBagLayout();
    GridLayout gridLayout = new GridLayout();
    CardLayout cardLayout = new CardLayout();
    JPanel panelMain = new JPanel();
    JPanel panelLeft = new JPanel();
    JPanel panelInnerLeft = new JPanel();
    JPanel panelRight = new JPanel();

    panelMain.setLayout(borderLayout);
    panelLeft.setLayout(gridBagLayout);
    panelInnerLeft.setLayout(gridLayout);
    panelRight.setLayout(cardLayout);

    button1 = new JButton("Button 1");
    button2 = new JButton("Button 2");
    button3 = new JButton("Button 3");
    button4 = new JButton("Button 4");

    panelInnerLeft.add(button1,gridLayout);
    panelInnerLeft.add(button2,gridLayout);
    panelInnerLeft.add(button3,gridLayout);
    panelInnerLeft.add(button4,gridLayout);

    panelLeft.add(panelInnerLeft);
    panelMain.add(panelLeft);
    panelMain.add(panelRight);
    add(panelMain);

【问题讨论】:

    标签: java swing awt layout-manager


    【解决方案1】:

    这是用于制作that screenshot 的确切代码。

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.*;
    
    public class CompoundLayout01 {
    
        private JComponent ui = null;
    
        CompoundLayout01() {
            initUI();
        }
    
        public void initUI() {
            if (ui!=null) return;
    
            ui = new JPanel(new BorderLayout(4,4));
            ui.setBorder(new TitledBorder("BorderLayout"));
    
            CardLayout cardLayout = new CardLayout();
            JPanel cards = new JPanel(cardLayout);
            cards.setBorder(new TitledBorder("CardLayout"));
            ui.add(cards);
    
            JPanel lineStart = new JPanel(new GridBagLayout());
            lineStart.setBorder(new TitledBorder("GridBagLayout"));
            // will appear on the left, in a LTR text orientation locale
            ui.add(lineStart, BorderLayout.LINE_START);
    
            JPanel buttonsCentered = new JPanel(new GridLayout(0, 1, 10, 10));
            buttonsCentered.setBorder(new TitledBorder("GridLayout"));
            // as single component added w/no constraint, will be centered
            lineStart.add(buttonsCentered); 
            for (int ii=1; ii<5; ii++) {
                JButton b = new JButton("Button " + ii);
                buttonsCentered.add(b);
            }
        }
    
        public JComponent getUI() {
            return ui;
        }
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception useDefault) {
                    }
                    CompoundLayout01 o = new CompoundLayout01();
    
                    JFrame f = new JFrame(o.getClass().getSimpleName());
                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    f.setLocationByPlatform(true);
    
                    f.setContentPane(o.getUI());
                    f.pack();
                    f.setMinimumSize(f.getSize());
    
                    f.setVisible(true);
                }
            };
            SwingUtilities.invokeLater(r);
        }
    }
    

    【讨论】:

      【解决方案2】:
      panelMain.setLayout(borderLayout);
      ...
      panelMain.add(panelLeft);
      panelMain.add(panelRight);
      

      阅读 Layout Managers 上的 Swing 教程。

      它将向您展示如何使用BorderLayout。

      您需要在添加每个组件时指定“约束”。喜欢BorderLayout.LINE_START,或BorderLayout.CENTER。

      以下也是错误的:

      panelInnerLeft.setLayout(gridLayout);
      ...
      panelInnerLeft.add(button1,gridLayout);
      panelInnerLeft.add(button2,gridLayout);
      panelInnerLeft.add(button3,gridLayout);
      panelInnerLeft.add(button4,gridLayout);
      

      阅读GridLayout 部分。 GridLayout 不需要约束。

      【讨论】:

        【解决方案3】:

        我不知道你是否需要一些特定的布局,但如果你想要更多的控制,你可以看看我的例子。请注意,我必须自己处理一些尺寸。此外,如果您需要更多控制权,您可以随时使用null 作为布局。

        import java.awt.FlowLayout;
        import javax.swing.BorderFactory;
        import javax.swing.JButton;
        import javax.swing.JPanel;
        
        import javax.swing.WindowConstants;
        import javax.swing.border.BevelBorder;
        import javax.swing.SwingUtilities;
        
        public class NewJFrame extends javax.swing.JFrame {
            private JPanel jPanel1;
            private JButton jButton1;
            private JButton jButton2;
            private JButton jButton3;
            private JPanel jPanel2;
            private JButton jButton4;
            private JPanel ButtonsPanel;
        
            public static void main(String[] args) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        NewJFrame inst = new NewJFrame();
                        inst.setLocationRelativeTo(null);
                        inst.setVisible(true);
                    }
                });
            }
        
            public NewJFrame() {
                super();
                initGUI();
            }
        
            private void initGUI() {
                try {
                    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        
                    jPanel1 = new JPanel();
                    getContentPane().add(jPanel1, BorderLayout.CENTER);
                    jPanel1.setLayout(null);
        
                    ButtonsPanel = new JPanel();
                    FlowLayout ButtonsPanelLayout = new FlowLayout();
                    jPanel1.add(ButtonsPanel);
                    ButtonsPanel.setLayout(ButtonsPanelLayout);
                    ButtonsPanel.setBounds(12, 23, 104, 215);
                    ButtonsPanel.setBorder(
                    BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
        
                    jButton1 = new JButton();
                    ButtonsPanel.add(jButton1);
                    jButton1.setText("jButton1");
                    jButton1.setPreferredSize(new java.awt.Dimension(85, 23));
        
                    jButton2 = new JButton();
                    ButtonsPanel.add(jButton2);
                    jButton2.setText("jButton2");
                    jButton2.setPreferredSize(new java.awt.Dimension(85, 23));
        
                    jButton3 = new JButton();
                    ButtonsPanel.add(jButton3);
                    jButton3.setText("jButton3");
                    jButton3.setPreferredSize(new java.awt.Dimension(85, 23));
        
                    jButton4 = new JButton();
                    ButtonsPanel.add(jButton4);
                    jButton4.setText("jButton4");
                    jButton4.setPreferredSize(new java.awt.Dimension(85, 23));
        
                    jPanel2 = new JPanel();
                    jPanel1.add(jPanel2);
                    jPanel2.setLayout(null);
                    jPanel2.setBounds(122, 23, 250, 215);
                    jPanel2.setBorder(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
        
                    pack();
                    setSize(400, 300);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        

        【讨论】:

        • jPanel1.setLayout(null); .. 对于布局问题,这是一个直接的减号。考虑到原始图像给出了如何实现布局的提示,它会是负 4(边界 5)。
        • 是的,这是错误的。我猜你从来不需要维护过度使用空布局的遗留代码。我告诉你这是一场噩梦,任何向新手推荐这种东西的人都不应该在 Java 的这个角落提出建议。期间。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-23
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        • 2018-05-11
        • 2019-03-22
        • 1970-01-01
        相关资源
        最近更新 更多