【问题标题】:JPanel in the middle of the frame框架中间的JPanel
【发布时间】: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 为您做出明智的编辑决定。 :)

标签: java swing layout centering gridbaglayout


【解决方案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 我试图理解。如果我不能修复我写代码,也许我能理解一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多