如何使用 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中内容过多时滑动