JPanel в JFrame в NetBeans

Я создал Java-приложение (проект) в NetBeans, в котором я разработал JFrame с панелью меню и разные JPanels. Я хочу, чтобы эти JPanels появлялись внутри JFrame при действии различных пунктов меню, чтобы всякий раз, когда нажимаются элементы меню, разные JPanels появлялись внутри JFrame. Я разработал JFrame и JPanel по отдельности, но не смог связать их вместе.

Помогите пожалуйста друзья.


person Community    schedule 30.01.2009    source источник
comment
Ваше использование нескольких панелей JPanel нетрадиционно. Рассматривали ли вы вместо этого JTabbedPane?   -  person Zach Scrivena    schedule 30.01.2009


Ответы (7)


Вы можете использовать макет карты для этого. Макет карты может содержать множество компонентов (JPanel в вашем случае), и вы можете переключаться между ними. Легко добавить макет карты в палитру netbeans.

Док:

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/CardLayout.html

person Yngve Sneen Lindal    schedule 30.01.2009
comment
проблема не в макете, на самом деле после нажатия на пункт меню он не делает НИЧЕГО, значит, он не выполняет никаких действий, в выполненном действии я использовал new JPanel1();, это правильно, или что еще я должен добавить в код для добавления JPanel в JFrame во время выполнения. - person ; 30.01.2009
comment
Вы можете создать все свои панели при создании фрейма. Я бы предположил, что у вас есть главная панель с CardLayout: mainPanel.setLayout(new java.awt.CardLayout()); тогда вы могли бы просто: mainPanel.add(new, new); где новый JPanel - person Yngve Sneen Lindal; 30.01.2009
comment
Чтобы изменить вид на новую панель, выполните следующие действия: CardLayout layout = (CardLayout) mainPanel.getLayout(); layout.show (основная панель, новая); Это будет код в вашем прослушивателе действий. Может быть, есть какие-то другие более элегантные способы сделать это, но это сработает. - person Yngve Sneen Lindal; 30.01.2009

Из одного из ваших комментариев следует, что вы хотите динамически создавать JPanels при нажатии кнопок. Если это так, то CardLayout не идеален. Добиться такого же эффекта самостоятельно относительно легко. Код будет выглядеть примерно так:

public void actionPerformed(ActionEvent event) {
    Container contentPane = frame.getContentPane();
    contentPane.removeAll();
    contentPane.add(new YourPanel());
    contentPane.invalidate();
    contentPane.repaint();
}

Это предполагает, что панель для переодевания является единственным компонентом в раме. Если это не так, добавьте JPanel с BorderLayout на панель содержимого в Matisse, а затем добавьте новые панели к ней, а не к панели содержимого.

person Russ Hayward    schedule 10.05.2009

Конструктор графического интерфейса Matisse имеет довольно хорошую поддержку элемента управления «JTabbedPane», если это то, что вы ищете. Вы можете перетащить контейнер TabbedPane в свои формы, а затем перетащить на него другие контейнеры, чтобы создать новые вкладки.

Если вы ищете более продвинутое поведение, такое как скрытие/отображение разных контейнеров, когда пользователь нажимает разные кнопки, вам нужно будет написать некоторый код; конструктор графического интерфейса не может справиться с этим.

person Outlaw Programmer    schedule 08.02.2009

Сначала вы сохраняете его как файл .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

}
person shohan    schedule 20.04.2010

Если вы хотите, чтобы менюшки реагировали на клики, вам нужно добавить в пункты меню Listeners, которые в ответ будут показывать правильную панель.

person Kyle G    schedule 07.02.2009

после смены панели в JFrame выполните команду frameObj.pack();

person Community    schedule 30.04.2009

Если вы действительно хотите сделать свой графический интерфейс более привлекательным, используйте JDesktopPane и посмотрите на результат.

person Rajshri    schedule 23.06.2012