如何使用 Swing 在 JFrame 中添加面板

Posted

技术标签:

【中文标题】如何使用 Swing 在 JFrame 中添加面板【英文标题】:How to add panels in a JFrame using Swing 【发布时间】:2014-09-06 08:41:44 【问题描述】:

组件没有显示在我使用 Swing 的JFrame 中。 其实我的目的是:

    添加框架 在框架添加面板中 面板包含 3 个按钮

但它没有显示。

这是我的代码

public class Panels

    JFrame frame;
    JPanel panel;
    private JButton addButton;
    private JButton modifyButton;
    private JButton deleteButton;

    Panels()
    
        initGUI();
        launchFrame();
    

    public void initGUI()
    
        frame = new JFrame();
        panel = new JPanel();
        addButton = new JButton("Add");
        modifyButton = new JButton("Modify");
        deleteButton = new JButton("Delete");
    

    public void launchFrame()
    
        addButton.setBounds(130,50,225,25);
        addButton.setBounds(150,50,225,25);
        addButton.setBounds(170,50,225,25);
        addButton.setBounds(190,50,225,25);
        panel.add(addButton);
        panel.add(modifyButton);
        panel.add(deleteButton);
        panel.setLayout(null);
        panel.setBackground(Color.RED);

        frame.add(panel);
        frame.setTitle("My Frame with Panel");
        frame.setSize(600,400);
        frame.setLocationRelativeTo(null);
        frame.setLayout(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    

这里是调用 Panels 类的主要部分

在主函数上运行时,框架显示没有控制器(即未显示 3 个按钮)

public class Main

    public static void main(String[] args)
    
        Panels obj_panel=new Panels();
    

【问题讨论】:

可能会在设置边界之前尝试调用 set layout null。 这段代码有什么问题吗? 1) Swing GUI 可能必须在不同的平台上工作,使用不同的 PLAF,在不同的屏幕尺寸和分辨率上使用不同的字体大小默认设置。因此,它们不利于组件的精确放置。而是使用布局管理器,或 combinations of layout managers 以及 layout padding and borders 用于空白。 2) 提供 ASCII 艺术或简单的图形,说明 GUI 应如何以默认大小显示,并且(如果可调整大小)具有额外的宽度/高度。 【参考方案1】:

这是主要问题

frame.setLayout(null);

当您将布局设置为 null 时,这意味着它的所有组件必须设置边界。您尝试添加面板,没有任何界限。您只需设置面板中按钮的边界。如果删除上面的行,它会起作用。

其他我会认真研究的问题:

根本不要使用空布局。而是使用布局管理器,让他们为您处理尺寸和定位。这会产生一个更易于管理和灵活的 UI。请花一些时间来学习不同的布局管理器。从Laying out Components Within a Container开始

所有 Swing 应用程序都应在称为事件调度线程 (EDT) 的特殊线程上运行。请花点时间阅读Initial Threads,了解如何实现这一目标。

这是一个没有空布局的重构(修复“其他问题”),只使用布局管理器、边距和边框,主代码显示了如何在事件调度线程

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

public class Main 

    public static void main(String[] args) 
        SwingUtilities.invokeLater(new Runnable()
            public void run() 
                Panels obj_panel = new Panels();
            
        );   
    


class Panels 

    private JFrame frame;
    private JPanel panel;
    private JButton addButton;
    private JButton modifyButton;
    private JButton deleteButton;

    Panels() 
        initGUI();
        launchFrame();
    

    private void initGUI() 
        frame = new JFrame();       // default layout manager is BorderLayout
        panel = new JPanel();       // default layout manager is FlowLayout
        addButton = new JButton("Add");
        modifyButton = new JButton("Modify");
        deleteButton = new JButton("Delete");
    

    private void launchFrame() 
        JPanel buttonPanel = new JPanel(new GridLayout(0, 1, 10, 10));
        buttonPanel.setBackground(Color.RED);
        buttonPanel.add(addButton);
        buttonPanel.add(modifyButton);
        // add margin to left and right of delete button
        // other buttons will follow suit because of GridLayout
        deleteButton.setMargin(new Insets(0, 50, 0, 50));
        buttonPanel.add(deleteButton);
        // create some space at the top for the buttonPanel
        buttonPanel.setBorder(new EmptyBorder(20, 0, 0, 0));

        panel.add(buttonPanel);
        panel.setBackground(Color.RED);

        frame.add(panel);
        frame.setTitle("My Frame with Panel");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);   
    

【讨论】:

先生,CoreJAVA 最好的 gui 设计制作工具是什么? 我是java新手。在netbeans中设计后制作代码很困难 任何仅用于设计制作的工具? 在尝试使用设计编辑器之前学习编写代码。见the official tutorial。 疑问 1. 除 Netbeans 和 Eclipse 外,还有任何用于 Core Java 设计制作(GUI)的工具吗? 2.在你的回答中为什么你使用两个面板(例如buttonpane)面板就足够了? 3.如何手动设置面板大小。在这个问题中你设置了GridLayout?

以上是关于如何使用 Swing 在 JFrame 中添加面板的主要内容,如果未能解决你的问题,请参考以下文章

java swing问题:JFrame根面板不透明且可见,内容面板不透明且可见,层面板透明且可见,

从 Java Swing 中的另一个类访问 JPanel 变量

java swing编程问题:一个jframe中添加一个jpanel后,为jpanel添加一个滚动条,当jpanel中内容过多时滑动

将JLabel添加到使用BoxLayout的JFrame

第十一周课程总结

《Java Swing》第3节:布局管理器