java - 尽管在 java 中调整了窗体的大小,如何使 jLabels 保持附着在窗口窗体的角上?

标签 java swing layout jlabel layout-manager

我的 java 程序中有 4 个 jLabel,我将其放置在 4 个角落,尽管用户调整窗口大小,但我希望它们保留在那里。我已经编写了标签的代码,但似乎无法弄清楚如何将它们粘在每个角上。

这是我的 jLabels 代码

    JLabel label_1 = new JLabel("");
    label_1.setEnabled(false);
    label_1.setBounds(0, 0, 19, 19);
    contentPane.add(label_1);

    JLabel label_2 = new JLabel("");
    label_2.setEnabled(false);
    label_2.setBounds(0, 242, 19, 19);
    contentPane.add(label_2);

    JLabel label_3 = new JLabel("");
    label_3.setEnabled(false);
    label_3.setBounds(549, 242, 19, 19);
    contentPane.add(label_3);

    JLabel label_4 = new JLabel("");
    label_4.setEnabled(false);
    label_4.setBounds(549, 0, 19, 19);
    contentPane.add(label_4);

谢谢

最佳答案

  1. 不要使用空布局
  2. 不要使用setBounds(...)
  3. 一定要使用正确的布局管理器。阅读Layout Manager Tutorials了解所有血淋淋的细节。

请注意,通过使用 null 布局和 setBounds,您会将应用程序的布局变得非常僵化,非常难以调试、增强和修改,并且您还创建了一个在您的盒子上可能看起来不错的 GUI,但是在使用不同操作系统的另一台机器上,甚至在屏幕分辨率略有不同的相同操作系统上,可能看起来不太好。

例如,使用 GridBagLayout:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.*;
import static java.awt.GridBagConstraints.*;

public class LabelLayout extends JPanel {
   private static final int[] ANCHORS = {NORTHWEST, SOUTHWEST, NORTHEAST, SOUTHEAST};

   public LabelLayout() {
      setLayout(new GridBagLayout());
      for (int i = 0; i < ANCHORS.length; i++) {
         GridBagConstraints gbc = new GridBagConstraints();
         gbc.gridx = i / 2;
         gbc.gridy = i % 2;
         gbc.gridheight = 1;
         gbc.gridwidth = 1;
         gbc.weightx = 1.0;
         gbc.weighty = 1.0;
         gbc.anchor = ANCHORS[i];
         add(new JLabel("Label " + (i + 1)), gbc);
      }
   }


   private static void createAndShowGui() {
      JFrame frame = new JFrame("Labels");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new LabelLayout());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

其他一些注意事项:

  • 我尽量避免使用 GridBagLayouts,因为它们是较复杂的布局之一,但对于您的问题,它们工作得很好且简单。
  • 您的问题也可以通过使用嵌套 JPanel 来解决,每个 JPanel 使用更简单的布局(例如 BorderLayout)。
<小时/>

演示程序,第 2 次迭代,显示两个 GUI,一个使用 GridBagLayout,另一个使用嵌套 JPanel,每个都使用 BorderLayout:

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.*;

import static java.awt.GridBagConstraints.*;

public class LabelLayout {
   private static final int[] ANCHORS = { NORTHWEST, NORTHEAST, SOUTHWEST,
         SOUTHEAST };
   private JPanel gridBagPanel = new JPanel(new GridBagLayout());
   private JPanel borderPanel = new JPanel(new BorderLayout());

   public LabelLayout() {
      for (int i = 0; i < ANCHORS.length; i++) {
         GridBagConstraints gbc = new GridBagConstraints();
         gbc.gridx = i % 2;
         gbc.gridy = i / 2;
         gbc.gridheight = 1;
         gbc.gridwidth = 1;
         gbc.weightx = 1.0;
         gbc.weighty = 1.0;
         gbc.anchor = ANCHORS[i];
         gridBagPanel.add(new JLabel("Label " + (i + 1)), gbc);
      }

      JPanel northPanel = new JPanel(new BorderLayout());
      JPanel southPanel = new JPanel(new BorderLayout());

      northPanel.add(new JLabel("Label 1"), BorderLayout.WEST);
      northPanel.add(new JLabel("Label 2"), BorderLayout.EAST);
      southPanel.add(new JLabel("Label 3"), BorderLayout.WEST);
      southPanel.add(new JLabel("Label 4"), BorderLayout.EAST);

      borderPanel.add(northPanel, BorderLayout.NORTH);
      borderPanel.add(southPanel, BorderLayout.SOUTH);
   }

   public JPanel getGridBagPanel() {
      return gridBagPanel;
   }

   public JPanel getBorderPanel() {
      return borderPanel;
   }

   private static void createAndShowGui() {
      LabelLayout labelLayout = new LabelLayout();

      JFrame frame = new JFrame("Label GridBagLayout");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(labelLayout.getGridBagPanel());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);

      frame = new JFrame("Label BorderLayout");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(labelLayout.getBorderPanel());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);

   }

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

关于java - 尽管在 java 中调整了窗体的大小,如何使 jLabels 保持附着在窗口窗体的角上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21463352/

相关文章:

java - 是否可以读取.txt文件的文件名并将其写入二叉树?

ios - 段落最后两行之间的间距更大?

java - "Removing"char 数组 java 中的重复空格

java - 执行Java程序appium出错及其他异常

java - 读取 CSV 中的换行符,这些换行符在 spring 批处理的 FlatfileItemReader 中的文件中引用

java - 高分辨率(MS Surface)上的不良 Swing UI 缩放

java - 在 Eclipse AVD 中,我得到 "Unfortunately,Test1 has stopped working"

java - JFrame 调整大小并且 ScrollBars 不可见

html - 3 个盒子正确堆叠所需的 CSS float 帮助

xaml - ScrollView 中的 Xamarin Center StackLayout