【问题标题】:Buttons will not be displayed horizontal to each other. Only overlapped on top of each other按钮不会彼此水平显示。只是相互重叠
【发布时间】:2016-08-29 02:26:41
【问题描述】:

我在为我的 java swing 项目打印按钮时遇到问题。对于类,我想复制一个 GUI。到目前为止,我已经能够做得很好。但是我遇到了按钮在同一位置相互重叠而不是水平相邻的问题。下面是如何将按钮打印到面板上的图像。

所以我有两个面板,一个包含标签和文本框 (Toppane),另一个包含按钮,总共 5 个 (bottomPane)。我试图让五个按钮打印在 GUI 的底部并且很难。我觉得我错过了一些简单的东西。

--------------------------------------------------------------
|                 label [textfield]                          |
|                 label [textField]                          |
|                 label [textfield]                          |
|-------------------------------------------------------------
|  [button] [button] [button] [button] [button]              |
--------------------------------------------------------------

但我明白了:

--------------------------------------------------------------
|                 label [textfield]                          |
|                 label [textField]                          |
|                 label [textfield]                          |
|-------------------------------------------------------------
|              [        Button's 12345       ]               |
--------------------------------------------------------------

代码:

package book;

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;


/**
 *
 * @author KJ4CC
 */
public class Book extends JFrame  {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       Book book = new Book();
        book.bookingUI();
    }
    public static void  bookingUI(){

        //sets windows, and pane in the UI 
        JFrame frame = new JFrame("Ye old Book store");
        JPanel toppane = new JPanel(new GridBagLayout());
        JPanel bottomPane = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        frame.setSize(1000, 600);
        frame.setVisible(true);

        //adds labels  to the window
        JLabel num = new JLabel("Enter Number of Items in this Order");
        JLabel bookID = new JLabel("111111");
        JLabel quantityItem = new JLabel("222222");
        JLabel itemInfo = new JLabel("333zfgfsfg333");
        JLabel subtotal = new JLabel("4444444");

        //adding the labels to the panel 
        c.anchor = GridBagConstraints.EAST;
        c.weighty = 1;
        c.gridx = 2;
        c.gridy = 1;
        toppane.add(num, c);
        c.gridx = 2;
        c.gridy = 2;
        toppane.add(bookID, c);
        c.gridx = 2;
        c.gridy = 3;
        toppane.add(quantityItem, c);
        c.gridx = 2;
        c.gridy = 4;
        toppane.add(itemInfo,c);
        c.gridx = 2;
        c.gridy = 5;
        toppane.add(subtotal,c);
        bottomPane.setBackground(Color.GREEN);
        frame.add(toppane,BorderLayout.EAST);

       //adds textfields to the frame 
        JTextField amount = new JTextField();
        JTextField id = new JTextField();
        JTextField quantity = new JTextField();
        JTextField info = new JTextField();
        JTextField total = new JTextField();

        //add textfield to panel
        c.ipadx = 230;
        c.gridx = 3;
        c.gridy= 1;
        toppane.add(amount, c);
        c.gridx = 3;
        c.gridy = 2;
        toppane.add(id, c);
        c.gridx = 3;
        c.gridy = 3;
        toppane.add(info, c);
        c.gridx = 3;
        c.gridy = 4;
        toppane.add(total, c);
        c.gridx = 3;
        c.gridy = 5; 
        toppane.add(quantity,c);

    //setting up buttons to be placed onto the bottompanel 
    JButton processItem = new JButton("Process Item");
    JButton confirmItem = new JButton("Confirm Item");
    JButton viewOrder = new JButton("View Order");
    JButton finishOrder = new JButton("Finish Order ");
    JButton newOrder = new JButton("New Order");
    JButton exit = new JButton("Exit");

    //adding the buttons to the pane.
    GridBagConstraints b = new GridBagConstraints();
    b.anchor = GridBagConstraints.NORTHWEST;
    bottomPane.add(processItem, c);
    bottomPane.add(confirmItem,c);
    bottomPane.add(viewOrder, c);
    bottomPane.add(finishOrder,c);
    bottomPane.add(newOrder,c);

    bottomPane.add(exit, c);
    bottomPane.setBackground(Color.BLUE);
    frame.add(bottomPane,BorderLayout.SOUTH);
    }
}

我个人觉得这与我使用的布局管理器有关。我不知道我是否将它正确地用于正确的应用程序。我一直在使用GridBagLayout,这就是我迄今为止用于学校的全部内容。

【问题讨论】:

  • 1) “是的,我知道颜色选择很丑……但这是教授想要的,哈哈” 这并不意味着您需要在此处显示的代码,您可以在布局问题修复后将其放入! 2) 以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果可调整大小,则具有更大的宽度和高度。 3) “我一直在使用GridBagLayout,这就是我迄今为止在学校所用的所有东西。” 当你只有一把锤子时,一切看起来都像钉子。不同的布局管理器适用于不同的事情,而且通常最简单..
  • .. 通过组合布局管理器来创建 GUI。
  • 我添加了一些艺术来展示我在说什么哈哈,我还认为 gridbaglayout 会自动执行此操作,但我想我会研究其他一些经理。
  • 您在代码的底部创建了一个 GridBagConstraints 对象 b,但您将其保留为未使用。在添加按钮时,也许您可​​以(并且应该)使用它而不是其他 GridBagConstraints 对象 c,特别是因为您已经修改了 c 的许多字段(这可能是您的问题的原因)。
  • @JohnathanYaesu -1,不够box drawing characters,哈哈。

标签: java swing jbutton layout-manager


【解决方案1】:

您的问题是您对每个新按钮都使用相同的约束c

bottomPane.add(processItem, c);
bottomPane.add(confirmItem,c);
bottomPane.add(viewOrder, c);
bottomPane.add(finishOrder,c);
bottomPane.add(newOrder,c);

您对c 所做的最后一次修改是在您做的时候:

c.gridx = 3;
c.gridy = 5; 

然后您只是对所有 5 个新按钮重复使用相同的约束,从而将它们全部添加到相同的网格位置。

您需要为每个约束设置相应的约束(例如,设置 c 的值,那里也有未使用的 b)。

【讨论】:

  • 是的,我刚刚注意到,我会看看我是否不能让它以这种方式工作。我确实切换了布局,现在效果很好
【解决方案2】:

GridBagLayout 已过时。和它一起工作很痛苦。使用像MigLayout 这样的现代布局管理器,可以非常快速地创建您的代码示例。

package com.zetcode;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import net.miginfocom.swing.MigLayout;

/**
 * MigLayout demonstration example.
 * @author Jan Bodnar
 * Website zetcode.com
 */

public class MigLayoutBookEx extends JFrame {

    public MigLayoutBookEx() {

        initUI();
    }

    private void initUI() {

        JLabel lbl1 = new JLabel("Label");
        JLabel lbl2 = new JLabel("Label");
        JLabel lbl3 = new JLabel("Label");

        JTextField field1 = new JTextField(15);
        JTextField field2 = new JTextField(15);
        JTextField field3 = new JTextField(15);

        JButton btn1 = new JButton("Button");
        JButton btn2 = new JButton("Button");
        JButton btn3 = new JButton("Button");
        JButton btn4 = new JButton("Button");
        JButton btn5 = new JButton("Button");

        createLayout(lbl1, field1, lbl2, field2, lbl3, field3,
                btn1, btn2, btn3, btn4, btn5);

        setTitle("MigLayoutExample");

        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void createLayout(JComponent... arg) {

        setLayout(new MigLayout("ins 10lp, gap 5lp 8lp, fillx", "[center]"));

        add(arg[0], "split 2, span");
        add(arg[1], "wrap");
        add(arg[2], "split 2, span");
        add(arg[3], "wrap");
        add(arg[4], "split 2, span");
        add(arg[5], "wrap");
        add(arg[6], "split 5, gapy 5lp, align left");
        add(arg[7]);
        add(arg[8]);
        add(arg[9]);
        add(arg[10]);

        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            MigLayoutBookEx ex = new MigLayoutBookEx();
            ex.setVisible(true);
        });
    }
}

布局是使用各种约束的组合创建的。一旦你学会了这一点,最实用的布局就是小菜一碟。您可以通过经理的website了解更多信息。

截图:

【讨论】:

    【解决方案3】:

    好的,所以我将底部面板设置为 boxlayout 并将按钮设置为水平!

    带有修复的代码!

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package book;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    import javax.swing.BoxLayout;
    import java.awt.GridBagLayout;
    import java.awt.GridBagConstraints;
    import java.awt.Insets;
    
    
    /**
     *
     * @author KJ4CC
     */
    public class UserInterface extends JFrame {
    
        public void startUI(){
    
            UserInterface gui = new UserInterface();
            gui.bookingUI();
        }
        public static void  bookingUI(){
            //sets windows, and pane in the UI 
            JFrame frame = new JFrame("Ye old Book store");
            JPanel toppane = new JPanel(new GridBagLayout());
            JPanel bottomPane = new JPanel();
            bottomPane.setLayout(new BoxLayout(bottomPane, BoxLayout.LINE_AXIS)); <---------------------------------------------Here is the fix
            GridBagConstraints c = new GridBagConstraints();
            frame.setSize(800, 300);
            frame.setVisible(true);
            //adds labels  to the window
            JLabel num = new JLabel("Enter Number of Items in this Order");
            JLabel bookID = new JLabel("111111");
            JLabel quantityItem = new JLabel("222222");
            JLabel itemInfo = new JLabel("33333");
            JLabel subtotal = new JLabel("4444444");
            //adding the labels to the panel-----------------------------------------------------
            c.insets = new Insets(5,0,0,0);
            c.gridx = 2;
            c.gridy = 1;
            toppane.add(num, c);
            c.gridx = 2;
            c.gridy = 2;
            toppane.add(bookID, c);
            c.gridx = 2;
            c.gridy = 3;
            toppane.add(quantityItem, c);
            c.gridx = 2;
            c.gridy = 4;
            toppane.add(itemInfo,c);
            c.gridx = 2;
            c.gridy = 5;
            toppane.add(subtotal,c);
            toppane.setBackground(Color.GREEN);
            frame.add(toppane);
    
    
           //adds textfields to the frame ----------------------------------------------------
            JTextField amount = new JTextField();
            JTextField id = new JTextField();
            JTextField quantity = new JTextField();
            JTextField info = new JTextField();
            JTextField total = new JTextField();
            //add textfield to panel
            c.ipadx = 400;
            c.insets = new Insets(5,10,0,0);
            c.gridx = 3;
            c.gridy= 1;
            toppane.add(amount, c);
            c.gridx = 3;
            c.gridy = 2;
            toppane.add(id, c);
            c.gridx = 3;
            c.gridy = 3;
            toppane.add(info, c);
            c.gridx = 3;
            c.gridy = 4;
            toppane.add(total, c);
            c.gridx = 3;
            c.gridy = 5; 
            toppane.add(quantity,c);
    
        //----------------------------------------------------------BUTTOM PANE-------------------------
        //setting up buttons to be placed onto the bottompanel 
        JButton processItem = new JButton("Process Item");
        JButton confirmItem = new JButton("Confirm Item");
        JButton viewOrder = new JButton("View Order");
        JButton finishOrder = new JButton("Finish Order ");
        JButton newOrder = new JButton("New Order");
        JButton exit = new JButton("Exit");
        //adding the buttons to the pane.---------------------------------------------------------------
        GridBagConstraints b = new GridBagConstraints();
        b.ipadx = 20;
        b.ipady = 20;
        b.gridx = 0;
        b.gridy = 1;
        bottomPane.add(processItem, c);
        b.gridx = 0;
        b.gridy = 2;
        bottomPane.add(confirmItem,c);
        b.gridx = 0;
        b.gridy = 3;
        bottomPane.add(viewOrder, c);
        b.gridx = 0;
        b.gridy = 4;
        bottomPane.add(finishOrder,c);
        b.gridx = 0;
        b.gridy = 5;
        bottomPane.add(newOrder,c);
        b.gridx = 0;
        b.gridy = 6;
        bottomPane.add(exit, c);
        bottomPane.setBackground(Color.BLUE);
        frame.add(bottomPane,BorderLayout.SOUTH);
        frame.setSize(810, 310);
    
        }
    
    
    
    }
    

    【讨论】:

    • 请注意,您正在设置b,但仍将c 传递给add(),尽管这可能无关紧要,因为您现在使用的是BoxLayout。不过,不要马虎!
    • 我回去修好了!我想看看它是如何工作的,它也做了同样的事情。
    • 我只会使用带有FlowLayout 的面板。 FlowLayout 将自动在组件之间提供 5 个像素的间距。
    【解决方案4】:

    您需要在底部窗格中使用 Flow 布局。不比 GridLayout 更适合这个用途。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多