我在 NetBeans 中创建了一个 Java 应用程序(项目),其中我设计了一个JFrame
带有菜单栏的和不同的JPanels
. 我希望这些JPanels
出现在JFrame
不同菜单项的 on 操作中,因此每当单击菜单项时,JPanels
应该在JFrame
. 我已经分别设计了两者JFrame
,JPanel
但我无法将它们链接在一起。
请朋友们帮帮我。
您可以为此使用卡片布局。卡片布局可以包含许多组件(在您的情况下为 JPanel),您可以在它们之间切换。在 netbeans 调色板中添加卡片布局很容易。
文件:
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/CardLayout.html
从您的一条评论中可以看出,您希望在单击按钮时动态创建 JPanel。如果是这种情况,那么 CardLayout 并不理想。自己实现同样的效果相对容易。代码将如下所示:
public void actionPerformed(ActionEvent event) {
Container contentPane = frame.getContentPane();
contentPane.removeAll();
contentPane.add(new YourPanel());
contentPane.invalidate();
contentPane.repaint();
}
假设更换面板是框架中的唯一组件。如果不是,则将带有 BorderLayout 的 JPanel 添加到 Matisse 的内容窗格中,然后将新面板添加到该内容窗格中,而不是内容窗格中。
Matisse GUI 构建器对“JTabbedPane”控件有很好的支持,如果那是您正在寻找的。您可以将 TabbedPane 容器拖到表单中,然后将其他容器拖到其上以创建新选项卡。
如果您正在寻找更高级的行为,例如当用户按下不同的按钮时隐藏/显示不同的容器,您将需要编写一些代码;GUI 构建器没有能力处理这个问题。
首先,您将其保存为.java
文件。这是主要的 jframe 类。你先运行它。然后您会看到外部面板由构造函数添加到它。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* MainFrame.java
*
* Created on Apr 20, 2010, 5:20:26 PM
*/
package game;
import javax.swing.SwingUtilities;
/**
*
* @author S.M. Mahmudul hasan
*/
public class MainFrame extends javax.swing.JFrame {
/** Creates new form MainFrame */
public MainFrame() {
initComponents();
addPanel();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
firstPanel = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout firstPanelLayout = new javax.swing.GroupLayout(firstPanel);
firstPanel.setLayout(firstPanelLayout);
firstPanelLayout.setHorizontalGroup(
firstPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 457, Short.MAX_VALUE)
);
firstPanelLayout.setVerticalGroup(
firstPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 398, Short.MAX_VALUE)
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(firstPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(firstPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}// </editor-fold>
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainFrame().setVisible(true);
}
});
}
private void addPanel() {
MainPanel m=new MainPanel();
this.getContentPane().remove(0);
firstPanel.removeAll();
javax.swing.GroupLayout firstPanelLayout = new javax.swing.GroupLayout(firstPanel);
firstPanel.setLayout(firstPanelLayout);
firstPanelLayout.setHorizontalGroup(
firstPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(firstPanelLayout.createSequentialGroup()
.addGap(78, 78, 78)
.addComponent(m, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(79, Short.MAX_VALUE))
);
firstPanelLayout.setVerticalGroup(
firstPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(firstPanelLayout.createSequentialGroup()
.addGap(25, 25, 25)
.addComponent(m, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(23, 23, 23))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(firstPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(firstPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
SwingUtilities.updateComponentTreeUI(this.getContentPane());
}
// Variables declaration - do not modify
private javax.swing.JPanel firstPanel;
// End of variables declaration
}
面板类:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* MainPanel.java
*
* Created on Apr 20, 2010, 5:21:03 PM
*/
package game;
import java.awt.Graphics;
/**
*
* @author S.M. Mahmudul hasan
*/
public class MainPanel extends javax.swing.JPanel {
/** Creates new form MainPanel */
public MainPanel() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
setBorder(javax.swing.BorderFactory.createTitledBorder("paintable area"));
jLabel1.setText("Paintable area");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(86, 86, 86)
.addComponent(jLabel1)
.addContainerGap(128, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(103, 103, 103)
.addComponent(jLabel1)
.addContainerGap(119, Short.MAX_VALUE))
);
}// </editor-fold>
@Override public void paintComponent(Graphics g) {
super.paintComponent(g); // paints background
g.drawString("shohan", 50, 100);
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
// End of variables declaration
}
更改 JFrame 中的面板后,执行 frameObj.pack();
If you want the menus to react to clicks, you need to add Listeners to the menu items, Which in response will show the correct panel.
如果您真的想让您的 GUI 更具吸引力,请使用JDesktopPane并查看结果。