【问题标题】:How can I properly center a JPanel ( FIXED SIZE ) inside a JFrame?如何在 JFrame 中正确居中 JPanel ( FIXED SIZE )?
【发布时间】:2011-11-05 14:46:51
【问题描述】:

大家好! 我正在尝试解决一个 - 显然 - 简单的问题,但我无法解决它。 我正在开发一个带有 Java/Swing 库的示例应用程序; 我有一个 JFrame 和一个 JPanel。 我只想实现以下目标:

  1. JPanel必须在 JFrame 内居中。

  2. JPanel 必须具有始终指定的大小
    setPreferredSize() 方法。不得在此大小下调整其大小。

我尝试使用 GridBagLayout:这是我可以做到的唯一方式。

请参阅下面的示例:

/* file StackSample01.java */

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

public class StackSample01 {
    public static void main(String [] args) {

        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(100, 100));
        panel.setBackground(Color.RED);  

        frame.setLayout(new GridBagLayout());
        frame.add(panel, new GridBagConstraints());
        frame.setSize(new Dimension(200, 200));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}

Here截图:

我不会使用 GridBagLayout 来做太简单的事情。 我尝试了一个最简单的解决方案,使用 Box,但这不起作用:

示例代码:

/* file StackSample02.java */

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

public class StackSample02 {
    public static void main(String [] args) {

        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(100, 100));
        panel.setBackground(Color.RED); // for debug 

        panel.setAlignmentX(JComponent.CENTER_ALIGNMENT); // have no effect

        Box box = new Box(BoxLayout.Y_AXIS);

        box.add(Box.createVerticalGlue());
        box.add(panel);     
        box.add(Box.createVerticalGlue()); // causes a deformation

        frame.add(box);
        frame.setSize(new Dimension(200, 200));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}

Here截图,

有什么想法吗?谢谢大家:-)

【问题讨论】:

  • 您是否尝试过使用 BorderFactory 类在“面板”周围放置边框?我不是太熟悉,否则我举个更具体的例子。
  • “我不会使用 GridBagLayout 来做太简单的事情。” 为什么不呢?我对 GBL 有一种深刻而持久的厌恶,但对于这种情况,这将是我尝试的第一个布局。
  • @Andrew - 完全确认,除非使用 GBL,否则永远不会使用它 :-) 而是选择三大 Form、Mig、Design 中的一种,无论是个人最喜欢的。
  • @kleopatra 您对使用 setXxxSize() 的答案投了反对票,您能很好地为我们提供正确答案或指向正确答案的链接吗?我厌倦了阅读您的“-1 for this,-1 for that”cmets。
  • @mostruash 提示:有一个“频繁”标签 .. 老实说,我厌倦了那些没有做太多事情来寻找问题答案或投票理由的开发人员回答问题(上升和下降,并没有真正的不同)——毕竟,寻找东西是他们工作的精髓

标签: java swing gridbaglayout


【解决方案1】:

使用 GridBagLayout 创建一个名为“FixedPanel”的面板,并将首选大小设置为框架大小 然后将您的框架添加到 FixedPanel。

Frame = new JFrame("CenterFrame");         
Frame.setLocation(0, 0);
Frame.setSize(new Dimension(400,400));//dim

JPanel FixedPanel = new JPanel(new GridBagLayout());
FixedPanel.setPreferredSize(Frame.getSize());

JPanel myPanel = new JPanel();
myPanel.setPreferredSize(new Dimension(100,100));
myPanel.setBackground(Color.BLACK);

FixedPanel.add(myPanel);
Frame.add(FixedPanel);
Frame.setVisible(true);  

【讨论】:

    【解决方案2】:

    它只是拥有

    jPanel.setBounds(x, y, 1046, 503);

    其中 x 是右侧空间,y 是左侧空间。 你必须根据屏幕高度和宽度计算两边的空间

    【讨论】:

      【解决方案3】:

      你可以这样做。我必须制作一个国际象棋游戏,并且我希望棋子始终位于 JlayeredPane 单元的中心:

      private void formMouseReleased(java.awt.event.MouseEvent evt) {
          // TODO add your handling code here:
          if (jl != null)
          {
              jl.setLocation(evt.getX()+10, evt.getY()+10);
              Component com = findComponentAt(evt.getPoint());
              if (com instanceof JPanel)
              {
                  // System.out.println("Yes, it's a jpanel");
                  ((JPanel)com).add(jl);
                  ((JPanel)com).validate();
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        首先,谢谢大家。

        我再次回答我自己的问题,向大家展示我所做的选择。 请参阅下面的示例代码; 如您所见,我只包含了实现目标绝对必要的最小步骤。

        /* file StackResponse.java */
        
        import java.awt.*;
        import javax.swing.*;
        
        public class StackResponse {
            public static void main(String [] args) {
        
                JPanel panel = new JPanel();
                Dimension expectedDimension = new Dimension(100, 100);
        
                panel.setPreferredSize(expectedDimension);
                panel.setMaximumSize(expectedDimension);
                panel.setMinimumSize(expectedDimension);
        
                panel.setBackground(Color.RED); // for debug only
        
                Box box = new Box(BoxLayout.Y_AXIS);
        
                box.add(Box.createVerticalGlue());
                box.add(panel);     
                box.add(Box.createVerticalGlue());
        
                JFrame frame = new JFrame();
                frame.add(box);
                frame.setSize(new Dimension(200, 200));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
                frame.setMinimumSize(frame.getMinimumSize());   // cannot be resized-
        
                frame.setVisible(true);
        
            }
        }
        

        Here你可以看截图。

        问题解决了。 再次感谢大家。

        【讨论】:

          【解决方案5】:

          BoxLayout 可以很好地保存您的 setXxxSize(),然后只需添加 panel.setMaximumSize(new Dimension(100, 100));

          你的输出将是

          已被 setMinimumSize 移除注意 Container 是否有更大的尺寸...)

          import java.awt.*;
          import javax.swing.*;
          
          public class CustomComponent12 extends JFrame {
          
              private static final long serialVersionUID = 1L;
          
              public CustomComponent12() {
                  Box box = new Box(BoxLayout.Y_AXIS);
                  box.setAlignmentX(JComponent.CENTER_ALIGNMENT);
                  box.add(Box.createVerticalGlue());
                  box.add(new CustomComponents12());
                  box.add(Box.createVerticalGlue());
                  add(box);
                  pack();
                  setTitle("Custom Component Test / BoxLayout");
                  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  setMaximumSize(getMinimumSize());
                  setMinimumSize(getMinimumSize());
                  setPreferredSize(getPreferredSize());
                  setLocation(150, 150);
                  setVisible(true);
              }
          
              public static void main(String[] args) {
                  Runnable r = new Runnable() {
          
                      @Override
                      public void run() {
                          CustomComponent12 main = new CustomComponent12();
                      }
                  };
                  javax.swing.SwingUtilities.invokeLater(r);
              }
          }
          
          class CustomComponents12 extends JPanel {
          
              private static final long serialVersionUID = 1L;
          
              @Override
              public Dimension getMinimumSize() {
                  return new Dimension(100, 100);
              }
          
              @Override
              public Dimension getMaximumSize() {
                  return new Dimension(100, 100);
              }
          
              @Override
              public Dimension getPreferredSize() {
                  return new Dimension(100, 100);
              }
          
              @Override
              public void paintComponent(Graphics g) {
                  int margin = 10;
                  Dimension dim = getSize();
                  super.paintComponent(g);
                  g.setColor(Color.red);
                  g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
              }
          }
          

          【讨论】:

          • @kleopatra 有人可以在我自己的字里行间 :-) ,我的好奇心(我们只谈论没有任何孩子的最深的 JComponents)怎么样,或者如果有可能以另一种方式重新设置 setXxxSize
          【解决方案6】:

          使用

          panel.setMaximumSize(new Dimension(200,200));
          panel.setResizable(false)
          

          改为?

          【讨论】:

          • JPanel 没有 setResizable(boolean resizable) 方法。
          • -1 for setXXSize 和发明 api - 你知道如果你不知道就没有义务回答吗?胡乱猜测_肯定是错误的做法。
          猜你喜欢
          • 2015-03-23
          • 2013-06-02
          • 1970-01-01
          • 1970-01-01
          • 2013-10-22
          • 1970-01-01
          • 2014-01-19
          • 2014-08-23
          相关资源
          最近更新 更多