[JavaSwing] 的JPanel
开幕后推出 的JFrame 并引进 的JLabel, JButton的 和 JTextField的 也许你已经熟悉了如何创建的Java Swing界面. 此前出台频繁使用的对象, 我认为,我们应该学会一个很重要的它是集装箱 (集装箱, 持有人) 和配售 布局 (布局) 在容器中它.
JPanel是一个容器 (集装箱) 它用于包含相似的对象的JFrame但它不是 1 的JFrame. 容易理解,你可以想像我们的房子 1 的JFrame, 剩余的卧室, 客厅, 餐厅是在JPanel, 即在一个JFrame包含的JPanel, 在每个的JPanel可以含有对象或甚至其他的JPanel.
创建的JPanel
我们有 2 构造函数或使用的JPanel这是:
– 的JPanel(): 创建 1 默认布局的JPanel具有FlowLayout.
– 的JPanel(布局管理布局): 创建 1 的JPanel与指定布局.
例 1: 创建 1 包含的JFrame 2 的JPanel, 1 包含的JPanel 的JLabel, 1 包含的JPanel 2 JButton的允许添加或删除的JLabel.
package nguyenvanquan7826.JPanel; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class CreateJPanel extends JFrame implements ActionListener { private int numlabel = 0; // number JLabel in panel JPanel panel1, panel2; public CreateJPanel() { createJFrame(); } // create JFrame private void createJFrame() { setTitle("Create JPanel"); setLayout(new GridLayout(2, 1, 5, 5)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); createContent(); pack(); setLocationRelativeTo(null); setVisible(true); } private void createContent() { // create panel1 with layout default is FlowLayout panel1 = new JPanel(); // add a label into panel1 addJLabel(panel1); // create panel2 with GridLayout panel2 = new JPanel(new GridLayout(1, 2, 5, 5)); panel2.add(createJButton("Add a JLabel")); panel2.add(createJButton("Remove all JLabel")); // add panel1 and panel2 into JFrame add(panel1); add(panel2); } // add JLabel to panel and repaint private void addJLabel(JPanel panel) { panel.add(new JLabel("JLabel" + (++numlabel))); panel.validate(); panel.repaint(); } // remove all JLabel and repaint JPanel private void removeAllJLabel(JPanel panel) { panel.removeAll(); panel.validate(); panel.repaint(); numlabel = 0; } // create a JButton private JButton createJButton(String buttonName) { JButton btn = new JButton(buttonName); btn.addActionListener(this); return btn; } @Override public void actionPerformed(ActionEvent evt) { String command = evt.getActionCommand(); if (command == "Add a JLabel") { addJLabel(panel1); System.out.println("add" + panel1.getComponentCount()); } if (command == "Remove all JLabel") { removeAllJLabel(panel1); } } public static void main(String[] args) { new CreateJPanel(); } }
在这个例子中,我们创建 2 的JPanel, Panel1的是默认初始化, 没有参数传递给它的默认布局的FlowLayout (在序列对象的布局). 是Panel2与指定布局初始化是GridLayout的 (每个单元中的对象的布局是相等).
你也有讲究 2 颚 addJLabel(面板的JPanel) 和 removeAllJLabel(面板的JPanel), 使用add方法后,, 或JPanel的中的removeAll, 想改变它 (更多的JLabel, 或删除全部的JLabel) 如图, 在JFrame的更新,我们需要调用 2 验证方法() 和重绘() 渲染对象,可以的JPanel. 我们也可以用做同样的 的JFrame.
设置布局和边境进行的JPanel
把 布局 和 边境 方法我们使用的JPanel的setLayout和setBorder.
Cám ơn sự hướng dẫn của anh ! bài viết rất hay cho tôi !
anh giúp e với , giờ em đang có Một class JFrame chứa button và JPanelA , JPanelB sử dụng BorderLayout . e đã thực hiện được khi click button thì JPanelA sẽ được thay bằng JPanel A1 , JPanelB thay bằng JPanelB1 .
Nhưng giờ e muốn khi nhấn vào một button trên JPanelB1 thì JPanelA1 đó sẽ được thay bằng JPanelA2 có được không ? a gợi ý giúp e với .
Em làm mãi mà chẳng ra 🙂
这一个你可以使用回调机制与接口来调用从JPanelB1 JFrame中的JFrame,将取代JPanelA2为A1.
你能帮助我吗?, 我在 JFrame 上做了,但它不起作用. 它给出了一个错误
查看错误是什么,然后用谷歌搜索并查看他们如何修复它.