JPanel в середине кадра

Я пытаюсь поместить свою jpanel в середину фрейма... поэтому, когда пользователь пытается изменить размер фрейма окна, он остается посередине... что-то вроде этого:
красная рамка - моя панель

поэтому, если я изменяю размер, он должен оставаться посередине:
если вы изменяете размер кадра, он остается  посередине

я попытался изменить макет моей панели содержимого с помощью BorderLayout и поместить мою jpanel в центральное положение... но когда я меняю размер своего фрейма, панель переходит в верхний левый угол.
В моем построителе окон ситуация такая это:
моя ситуациямоя jpanel должна работать точно так же, как работает redbox. я пробовал все, но результат всегда один и тот же:
введите здесь описание изображенияэто мой код:< бр>

    package StudApp;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JTextPane;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.SwingConstants;
import java.awt.Color;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

    public class StudApp {
        private JFrame frame;
        private JPanel homeFirstRun;
        private ArrayList<Corso> corsi = new ArrayList<Corso>();
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new StudApp();
                }
            });
        }

        /**
         * Create the frame.
         */
        public StudApp() {
            frame = new JFrame("Student Note");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setBounds(100, 100, 450, 300);

            JMenuBar menuBar = new JMenuBar();
            frame.setJMenuBar(menuBar);

            JMenu menuHelp = new JMenu("Help");
            menuBar.add(menuHelp);

            JMenuItem menuIstrStud = new JMenuItem("Intructions Student Note");
            menuIstrStud.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    frame.remove(homeFirstRun);
                    frame.revalidate();
                    frame.repaint();
                    homeFirstRun = null;
                }
            });
            menuHelp.add(menuIstrStud);
            homeFirstRun = new JPanel();
            homeFirstRun.setBorder(new EmptyBorder(5, 5, 5, 5));
            homeFirstRun.setLayout(null);
            frame.getContentPane().add(homeFirstRun);


            JLabel welcomeMessage = new JLabel("Welcome to Student Note");
            welcomeMessage.setBounds(5, 5, 424, 18);
            welcomeMessage.setForeground(Color.DARK_GRAY);
            welcomeMessage.setHorizontalAlignment(SwingConstants.CENTER);
            welcomeMessage.setFont(new Font("Verdana", Font.BOLD, 14));
            homeFirstRun.add(welcomeMessage);



            JTextArea welcomeTextArea = new JTextArea();
            welcomeTextArea.setFont(new Font("Verdana", Font.PLAIN, 13));
            welcomeTextArea.setText(" I think it's your first time here.\n\n"
                                + " So the first step is to create a new course to\n insert your grades.\n\n"
                                + " If you want my advice, read how this program\n works in the help section (it is very simple),\n "
                                + "just 2 minutes ... believe me");
            welcomeTextArea.setEditable(false);
            welcomeTextArea.setBounds(27, 34, 381, 184);
            homeFirstRun.add(welcomeTextArea);

            frame.setVisible(true);
        }
    }

person Giovanni Far    schedule 13.12.2013    source источник
comment
+1 за ваше мудрое решение по редактированию. :)   -  person Andrew Thompson    schedule 13.12.2013


Ответы (1)


Есть несколько способов сделать это, но один из самых простых — дать contentPane GridBagLayout, а затем добавить интересующую вас JPanel без GridBagConstraints. Если интересующая панель JPanel — это единственное, что добавлено в этот контейнер, это поместит эту панель JPanel в центральное положение.

e.g.,

import java.awt.*;
import javax.swing.*;

public class CentralPanel {

   private static void createAndShowGui() {
      JFrame frame = new JFrame("CentralPanel");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setContentPane(new MyContentPane());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyContentPane extends JPanel {
   private static final int PREF_W = 700;
   private static final int PREF_H = 550;

   public MyContentPane() {
      setLayout(new GridBagLayout());
      add(new JPanelOfInterest());
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }
}

class JPanelOfInterest extends JPanel {
   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;

   public JPanelOfInterest() {
      setBorder(BorderFactory.createTitledBorder("JPanel of Interest"));
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }
}
person Hovercraft Full Of Eels    schedule 13.12.2013
comment
Поскольку вы меня опередили, я дам ссылку здесь, проверьте Укладка из компонентов внутри контейнера - person MadProgrammer; 13.12.2013
comment
@Hovercraft, спасибо, не могли бы вы написать строку кода в простом примере? Спасибо - person Giovanni Far; 13.12.2013
comment
@GiovanniFar: см., например, сообщение выше. - person Hovercraft Full Of Eels; 13.12.2013
comment
@GiovanniFar: "doesnt work" мне особо нечего сказать. Вы, конечно же, избавились от всех setBounds(...), верно? Покажите свой последний код, подробно опишите свои проблемы, дайте нам информацию, которую мы можем использовать. - person Hovercraft Full Of Eels; 13.12.2013
comment
@HovercraftFullOfEels, я пытаюсь понять. если я не могу исправить, я пишу код, только один момент, может быть, я смогу понять - person Giovanni Far; 13.12.2013
comment
@GiovanniFar: что, ты говоришь, что это не работает, до написания кода, чтобы попробовать это? - person Hovercraft Full Of Eels; 13.12.2013
comment
НЕТ! я попробовал ваше решение, но не работает, поэтому я пытаюсь понять, почему! я не настолько отсталый, чтобы писать, что не работает, прежде чем попробовать - person Giovanni Far; 13.12.2013
comment
я все еще проверяю, я думаю, что теперь бегу, я сделаю то, что я сделал всего за 10 минут - person Giovanni Far; 13.12.2013