Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BorderLayout,GridLayout,GridBagLayout?我应该用哪一种?_Java_Swing_Jframe_Jpanel - Fatal编程技术网

Java BorderLayout,GridLayout,GridBagLayout?我应该用哪一种?

Java BorderLayout,GridLayout,GridBagLayout?我应该用哪一种?,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我正在尝试创建此基本GUI,但无法正确设置面板。(数字为像素大小) 我曾尝试将本教程用作参考(),但我的教程从来没有这样做过 我的代码在类的顶部声明变量,然后创建一个构造函数来添加组件(面板、按钮等),然后在main方法中调用构造函数 import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import jav

我正在尝试创建此基本GUI,但无法正确设置面板。(数字为像素大小)

我曾尝试将本教程用作参考(),但我的教程从来没有这样做过

我的代码在类的顶部声明变量,然后创建一个构造函数来添加组件(面板、按钮等),然后在main方法中调用构造函数

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
公共类最终项目扩展JPanel {

}


我该怎么做才能让这个布局正确呢?面板中的面板、相互独立的面板等?

GridLayout
我从未实际使用过,但我不确定它是否可以做到这一点

BorderLayout
可以做到这一点,并且比
gridbagloayout
更简单

GridBagLayout
可以做到这一点

总的来说,
GridBagLayout
是最灵活的
LayoutManager
之一,非常值得学习,因此我建议在您需要它处理更复杂的事情之前,在这里使用它来适应简单的情况

如果您熟悉HTML,那么可以将
GridBagLayout
想象为与HTML表类似的工作方式

非常快-创建三个面板,并在其中设置大小/边框/您需要的任何内容

在单元格0,0中添加一个colspan为2的值。 在单元格1,0中添加一个 在单元格1,1中添加一个


完成后,尽管您可能希望指定resize/anchor/etc行为。

不,不要为此使用GridBagLayout,因为这样会增加比实际需要更多的复杂性。就我自己而言,我尽量避免使用这种布局及其所有潜在的陷阱,通常通过嵌套JPanel,每个都使用自己更简单的布局,您可以得到所需的一切。例如,在这里,您只需要一个边界布局:

  • 将顶部JPanel放置在BorderLayout.NORTH位置
  • 将左侧JPanel置于BorderLayout.WEST位置
  • 将中心JPanel放置在BorderLayout.center位置
就这样

同样,请查看Swing和layout manager教程,因为这些信息在那里得到了很好的展示


编辑
请注意,JFrame上没有显示任何内容,因为您没有将JPanel添加到JFrame


编辑2
例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;

import javax.swing.*;

public class SimpleLayout {
   private static final Color GREEN = new Color(200, 255, 200);
   private static final Color BLUE = new Color(200, 200, 255);

   private static void createAndShowGui() {
      JFrame frame = new JFrame("SimpleLayout");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      // note that a JFrame's contentPane uses BorderLayout by default
      frame.getContentPane().add(new ColorPanel(Color.pink, 800, 80), BorderLayout.NORTH);
      frame.getContentPane().add(new ColorPanel(GREEN, 300, 420), BorderLayout.WEST);
      frame.getContentPane().add(new ColorPanel(BLUE, 500, 420), BorderLayout.CENTER);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

class ColorPanel extends JPanel {
   private static final float FONT_POINTS = 24f;
   private int prefW;
   private int prefH;

   public ColorPanel(Color color, int prefW, int prefH) {
      setBackground(color);
      this.prefW = prefW;
      this.prefH = prefH;

      // GBL can be useful for simply centering components
      setLayout(new GridBagLayout()); 
      String text = String.format("%d x %d", prefW, prefH);
      JLabel label = new JLabel(text, SwingConstants.CENTER);
      label.setFont(label.getFont().deriveFont(FONT_POINTS));
      label.setForeground(Color.gray);
      add(label);
   }



   @Override
   public Dimension getPreferredSize() {
      return new Dimension(prefW, prefH);
   }
}

这显示为:


我的建议:您最需要的是一个BorderLayout,但话虽如此,我的主要建议是让您尝试一下,然后在仍然有问题的情况下显示代码。否则,我们很难猜到您可能做错了什么。我已经发布了我的代码:)您只添加了一个按钮…尝试添加其他按钮,一个在北方,一个在中间。。。。。。。。。。。。。。。。。。。更好的尝试我有点熟悉GridBagLayout和约束。你知道如何让3个面板按照我希望的方式与适当的约束对齐吗?css确实浮动:左,gridbag中是否有类似的内容?我将添加一个非常快速的摘要。我在上面发布了一个更新。我的框架上没有显示任何内容,我想我的gridx和gridy设置已经接近了。@MikeMilla:你没有将你的JPanel添加到JFrame中。我用gridbag添加了它们,但仍然很混乱。。。只看到蓝色。我添加了它们,但现在一切都是蓝色的。我尝试过这种边界布局,但用gridbag我至少可以看到一些东西。哇,谢谢。获取标签名称的非常聪明的方法。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;

import javax.swing.*;

public class SimpleLayout {
   private static final Color GREEN = new Color(200, 255, 200);
   private static final Color BLUE = new Color(200, 200, 255);

   private static void createAndShowGui() {
      JFrame frame = new JFrame("SimpleLayout");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      // note that a JFrame's contentPane uses BorderLayout by default
      frame.getContentPane().add(new ColorPanel(Color.pink, 800, 80), BorderLayout.NORTH);
      frame.getContentPane().add(new ColorPanel(GREEN, 300, 420), BorderLayout.WEST);
      frame.getContentPane().add(new ColorPanel(BLUE, 500, 420), BorderLayout.CENTER);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

class ColorPanel extends JPanel {
   private static final float FONT_POINTS = 24f;
   private int prefW;
   private int prefH;

   public ColorPanel(Color color, int prefW, int prefH) {
      setBackground(color);
      this.prefW = prefW;
      this.prefH = prefH;

      // GBL can be useful for simply centering components
      setLayout(new GridBagLayout()); 
      String text = String.format("%d x %d", prefW, prefH);
      JLabel label = new JLabel(text, SwingConstants.CENTER);
      label.setFont(label.getFont().deriveFont(FONT_POINTS));
      label.setForeground(Color.gray);
      add(label);
   }



   @Override
   public Dimension getPreferredSize() {
      return new Dimension(prefW, prefH);
   }
}