Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我不能更改框架内面板的位置?_Java_User Interface_Jframe_Jpanel - Fatal编程技术网

Java 为什么我不能更改框架内面板的位置?

Java 为什么我不能更改框架内面板的位置?,java,user-interface,jframe,jpanel,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; pub

我正在尝试创建一个带有几个按钮和绘图区域的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的外观:

如您所见,“画布”非常小,位于按钮的侧面。 我需要它放在他们下面,并填补框架面积。 有人能帮我解决那个问题吗?
谢谢您的帮助。

这是布局的另一个问题

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

添加到
ssGUI
的所有组件将以线性方式排成一行,尽可能多地容纳。当组件超过宽度时,它将被放置到下一行

可以考虑使用主面板的布局<代码> SSGUI < /代码>。A可能会给你想要的

  • 将主面板的布局设置为
    BorderLayout
  • 仅为按钮创建一个面板,并将此面板添加到主面板的
    NORTH
    位置
  • 以下是一个工作示例:

    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
    
        }
    }
    

    add(画布,BorderLayout.CENTER)是正确的,但是其他组件呢?您没有指定它们的位置吗?一个简单的解决方案是将另一个面板添加到borderlayout.north并添加按钮。我将添加部分更改为:
    add(b1,borderlayout.LINE_START);添加(b连接,边框布局。页面\开始);添加(b断开连接,BorderLayout.CENTER);添加(b2,边界布局。线_结束);添加(canvas,BorderLayout.PAGE_END)
    但它不做任何事情。GUI看起来仍然一样,我在哪里声明此布局?您可以在
    ssGUI
    的构造函数中执行此操作,例如
    this.setLayout(new GridBagLayout())现在我在说:
    无法添加到布局:约束必须是GridBagConstraint
    时出错。我必须改变我的
    add()
    方法吗?@DanyLavrov GridBagLayout是最灵活的布局之一,不幸的是,它也是更复杂的布局之一。您需要为其设置约束。请看一下我的解决方案中的链接。我已经读过了。对于每个组件,我都创建了以下内容:
    GridBagConstraints c=newgridbagconstraints();c.gridx=0;c、 gridy=0;添加(b1,c)