gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:14:19 24 4
gpt4 key购买 nike

我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com