gpt4 book ai didi

Java Swing 摆脱 Null 布局

转载 作者:行者123 更新时间:2023-12-02 03:36:55 25 4
gpt4 key购买 nike

enter image description here

我使用令人皱眉的空布局构建了一个很棒的 GUI(我定义了很多常量并使用了窗口调整大小监听器以使其变得简单)。一切都很顺利,直到我开始使用一台新电脑。现在,组件的位置不正确(从图片中您可以看到组件向下和向右偏移)。研究这个问题后,我了解到布局管理器确保组件在不同机器上正确定位。因此,我想开始在实际的布局管理器中重建 GUI。问题是,当我尝试使用实际的布局管理器时,我经常感觉组件的定位方式受到限制。

对于任何好奇的人,我最初使用的是带有 Windows 10 的戴尔 Inspiron 笔记本电脑,现在已改为华硕笔记本电脑(我不知道实际型号,但触摸屏可以与键盘分离),也使用 Windows 10。

我的问题:

哪种布局管理器可以最快、最简单地构建上图所示的 GUI(缺货的 Swing 布局其他布局)。我希望这种布局仅考虑少数而非所有组件的实际尺寸。使用此布局,我将如何定位库存按钮(左下角的锤子),以便库存按钮的左下角距容器左下角向上和向右 5 个像素,即使在调整大小之后也是如此容器?

提前致谢。感谢所有帮助。

编辑:“去找 key ”和“尝试强行打开门”选项应该考虑其大小。

最佳答案

我想到的最简单的解决方案是 BorderLayout主面板。将 textarea 添加到 NORTH/PAGE_START。制作另一个包含库存按钮 (WEST/LINE_START) 和位置标签 (EAST/) 的 BorderLayout LINE_END)。将其添加到主 BorderLayoutSOUTH/PAGE_END 中。然后只需添加 BoxLayout与包含两个按钮的主 BorderLayoutCENTER 垂直对齐。 Here's a tutorial对于标准布局管理器。

<小时/>

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Insets;
import java.awt.image.BufferedImage;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Example {

public Example() {
JTextArea textArea = new JTextArea("There is a locked door");
textArea.setRows(5);
textArea.setBorder(BorderFactory.createLineBorder(Color.GRAY));
textArea.setEditable(false);

WhiteButton button1 = new WhiteButton("Go find a key") {
@Override
public Dimension getMinimumSize() {
return new Dimension(200, 25);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(200, 25);
}

@Override
public Dimension getMaximumSize() {
return new Dimension(200, 25);
}
};
WhiteButton button2 = new WhiteButton("Attempt to force the door open");
button2.setMargin(new Insets(0, 60, 0, 60));

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
buttonPanel.add(button1);
buttonPanel.add(Box.createVerticalStrut(5));
buttonPanel.add(button2);

WhiteButton inventoryButton = new WhiteButton(
new ImageIcon(new BufferedImage(50, 50, BufferedImage.TYPE_INT_RGB)));

JLabel locationLabel = new JLabel("Location: 0");
locationLabel.setVerticalAlignment(JLabel.BOTTOM);

JPanel southPanel = new JPanel(new BorderLayout());
southPanel.add(inventoryButton, BorderLayout.WEST);
southPanel.add(locationLabel, BorderLayout.EAST);

JPanel mainPanel = new JPanel(new BorderLayout(0, 5));
mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
mainPanel.add(textArea, BorderLayout.NORTH);
mainPanel.add(buttonPanel);
mainPanel.add(southPanel, BorderLayout.SOUTH);

JFrame frame = new JFrame("Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}

private class WhiteButton extends JButton {

public WhiteButton() {
setBackground(Color.WHITE);
}

public WhiteButton(String text) {
this();
setText(text);
}

public WhiteButton(ImageIcon icon) {
this();
setIcon(icon);
setBorder(BorderFactory.createLineBorder(Color.GRAY));
}

}

}

关于Java Swing 摆脱 Null 布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37349270/

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