2013-12-13 2 views
4

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

так, если я изменить размер он должен оставаться в центре:
if you change the size of the frame it remains in the middle

я пытался изменить расположение моей ContentPane с BorderLayout и кладу JPanel в центральном положении ... но когда я изменяю размер моего фрейма, панель переходит в верхний левый угол.
В моем оконном застройщике ситуация такова:
my situation my jpanel должен работать именно так, как работает redbox. я попробовал все, но результат каждый раз то же самое:
enter image description here это мой код:

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); 
     } 
    } 
+0

+1 за мудрое решение для редактирования. :) –

ответ

4

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

например,

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); 
    } 
} 
+1

Поскольку вы избили меня, я пойду по ссылке здесь. Отъезд [Выравнивание компонентов в контейнере] (http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html) – MadProgrammer

+0

@Hovercraft thx вы можете написать строку кода в простом примере? thx –

+0

@ GiovanniFar: см., например, выше. –

Смежные вопросы