框架中间的JPanel

Posted

技术标签:

【中文标题】框架中间的JPanel【英文标题】:JPanel in the middle of the frame 【发布时间】:2013-12-31 17:03:37 【问题描述】:

我正在尝试将我的 jpanel 放在框架的中间...所以当用户尝试更改窗口框架的大小时,它仍然在中间... 像这样:

所以如果我改变大小,它必须保持在中间:

我尝试使用 BorderLayout 更改我的 contentPane 的布局并将我的 jpanel 放在中心位置...但是当我更改框架的大小时,面板进入左上角。 在我的 windows builder 中,情况是这样的: 我的 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);
        
    

【问题讨论】:

+1 为您做出明智的编辑决定。 :) 【参考方案1】:

有几种方法可以做到这一点,但最简单的方法之一是给 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);
   

【讨论】:

既然你打败了我,我就点这里的链接,看看Laying out Components within a Container @Hovercraft thx 你能在一个简单的例子中写下这行代码吗?谢谢 @GiovanniFar:参见上面的帖子。 @GiovanniFar:"doesnt work" 没有给我太多继续。你当然已经摆脱了所有setBounds(...),对吧?展示您的最新代码,详细描述您的问题,提供我们可以使用的信息。 @HovercraftFullOfEels 我试图理解。如果我不能修复我写代码,也许我能理解一下

以上是关于框架中间的JPanel的主要内容,如果未能解决你的问题,请参考以下文章

使用java swing做个界面,中间的容器部分是加载一个网页,该如何解决、可以提供代码参考最好

Java JPanel repaint() 问题?

尝试创建自定义布局

如何关闭扩展JPanel的类[重复]

如何在不覆盖JFrame的情况下将JPanel图形添加到JFrame

自己写贪吃蛇的一下感悟