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

时间:2014-09-06 08:41:45

标签: java swing jframe jpanel jbutton

我的JFrame使用Swing不会显示组件。 其实我的目标是:

  1. 添加框架
  2. 在框架添加面板
  3. Panel cantains 3 buttons
  4. 但它没有表现出来。

    这是我的代码

    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();
        }
    }
    

1 个答案:

答案 0 :(得分:3)

这是主要问题

frame.setLayout(null);

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

其他问题我真的要看一下:

  • 根本不使用空布局。而是使用布局管理器,让他们为您处理大小和位置。这样可以实现更易于管理和灵活的UI。请花一些时间来学习不同的布局管理器。从Laying out Components Within a Container

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

这是一个重构(修复"其他问题" )没有空布局,只使用布局管理器,边距和边框,主要代码显示如何在Event Dispatch Thread上运行程序

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