为什么我不能改变面板内面板的位置?

时间:2016-03-24 11:00:09

标签: java user-interface jframe jpanel

我正在尝试使用几个按钮和绘图区域创建GUI。 它似乎工作,除了绘图区域非常小,而不是在正确的位置。 这是我的代码:

public class ssGUI extends JPanel implements ActionListener{
private static final long serialVersionUID = 1L;
protected JButton b1, bConnect, bDisconnect, b2;
protected JPanel canvas;

public ssGUI() {
    // run button
    b1 = new JButton("do something");
    b1.setVerticalTextPosition(AbstractButton.CENTER);
    b1.setHorizontalTextPosition(AbstractButton.LEADING);
    b1.setMnemonic(KeyEvent.VK_D);
    b1.addActionListener(this);
    b1.setEnabled(false);
    // connect button
    bConnect = new JButton("Connect");
    bConnect.setMnemonic(KeyEvent.VK_E);
    bConnect.addActionListener(this);
    bConnect.setEnabled(true);
    // disconnect button
    bDisconnect = new JButton("Disconnect");
    bDisconnect.setMnemonic(KeyEvent.VK_E);
    bDisconnect.addActionListener(this);
    bDisconnect.setEnabled(false);
    // clean nmea data button
    b2 = new JButton("do something else");
    b2.setMnemonic(KeyEvent.VK_E);
    b2.addActionListener(this);
    b2.setEnabled(false);
    // drawing panel
    canvas = new JPanel();
    canvas.setBackground(Color.white);

    add(b1); add(bConnect); add(bDisconnect); add(b2); add(canvas, BorderLayout.CENTER);
}

public static void createAndShowGUI() {
    JFrame frame = new JFrame("Range Adjustment GUI");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ssGUI newContentPane = new ssGUI();
    newContentPane.setOpaque(true);
    frame.setContentPane(newContentPane);
    frame.pack();
    frame.setVisible(true);
    frame.setLocation(500, 500);
    frame.setSize(500, 500);
}

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI(); 
        }
    });
}}

这就是我的GUI的样子:

enter image description here

正如您所看到的,“画布”非常小,位于按钮的侧面。 我需要将它放在它们下面并填充框架区域。 任何人都可以帮我解决这个问题吗? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

这是布局的另一个问题。

JPanel有默认布局,我没有看到你为ssGUI类设置布局。因此将使用默认布局(FlowLayout)。

添加到ssGUI的所有组件将以线性方式排列,以便尽可能多地保留。当您的组件超出宽度时,它将被放置到下一行。

您可以考虑使用主面板ssGUI的布局。 GridBagLayout可能会给你你想要的东西。

答案 1 :(得分:0)

  1. 将主面板的布局设置为BorderLayout
  2. 仅为您的按钮创建一个面板,并将此面板添加到主面板的NORTH位置。
  3. 这是一个有效的例子:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    
    import javax.swing.AbstractButton;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class ssGUI extends JPanel implements ActionListener {
        private static final long serialVersionUID = 1L;
        protected JButton b1, bConnect, bDisconnect, b2;
        protected JPanel canvas;
    
        public ssGUI() {
            setLayout(new BorderLayout());
            // run button
            b1 = new JButton("do something");
            b1.setVerticalTextPosition(AbstractButton.CENTER);
            b1.setHorizontalTextPosition(AbstractButton.LEADING);
            b1.setMnemonic(KeyEvent.VK_D);
            b1.addActionListener(this);
            b1.setEnabled(false);
            // connect button
            bConnect = new JButton("Connect");
            bConnect.setMnemonic(KeyEvent.VK_E);
            bConnect.addActionListener(this);
            bConnect.setEnabled(true);
            // disconnect button
            bDisconnect = new JButton("Disconnect");
            bDisconnect.setMnemonic(KeyEvent.VK_E);
            bDisconnect.addActionListener(this);
            bDisconnect.setEnabled(false);
            // clean nmea data button
            b2 = new JButton("do something else");
            b2.setMnemonic(KeyEvent.VK_E);
            b2.addActionListener(this);
            b2.setEnabled(false);
            // drawing panel
            canvas = new JPanel();
            canvas.setBackground(Color.white);
    
            JPanel topPanel = new JPanel();
            topPanel.add(b1);
            topPanel.add(bConnect);
            topPanel.add(bDisconnect);
            topPanel.add(b2);
            add(topPanel, BorderLayout.NORTH);
    
            add(canvas, BorderLayout.CENTER);
        }
    
        public static void createAndShowGUI() {
            JFrame frame = new JFrame("Range Adjustment GUI");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            ssGUI newContentPane = new ssGUI();
            newContentPane.setOpaque(true);
            frame.setContentPane(newContentPane);
            frame.pack();
            frame.setVisible(true);
            frame.setLocation(500, 500);
            frame.setSize(500, 500);
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
    
        }
    }