gpt4 book ai didi

java - 如何更改 JLabel 或我添加的任何其他组件的位置?

转载 作者:行者123 更新时间:2023-11-30 08:21:00 26 4
gpt4 key购买 nike

我正在尝试使用 OverlayLayout 和扩展的 JPanel 创建一个除了我放入其中的 JLabel 图像之外没有边框或背景的半透明窗口...

我的问题是,当我尝试在最初添加的组件(即背景)上添加更多组件时,我不知道如何启用新组件位置的更改..x、y 等...

如果可能的话,请告诉我我能做什么,不要只是指给我布局管理器,如果有人愿意告诉我,我需要一个例子。

或者更好的是,告诉我我需要对我的代码做些什么才能获得预期的效果……比如将“文本”(A JLabel) 位置更改为 10,10 ... x 和 y。

package core;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LayoutManager;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.OverlayLayout;

public class App {
// Window & Panel...
public JWindow frame;
public TranslucentPanel panel;

// OverlayLayout
public LayoutManager overlay;

// Components
public JLabel bg;
public JLabel test;

// Constructor
public App() {
try {
// Basics...
frame = new JWindow();
frame.setBackground(new Color(0, 0, 0, 0));

// Overlay
panel = new TranslucentPanel();
overlay = new OverlayLayout(panel);
panel.setLayout(overlay);
frame.setContentPane(panel);

// initComponents
initComponents();

// Finalize Frame
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
catch(Exception e) {
e.printStackTrace();
}
}

// Initialize Additional Components
public void initComponents() throws Exception {
test = new JLabel("test");
test.setForeground(Color.WHITE);
frame.add(test);

bg = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/ball.png"))));
frame.add(bg);

// What must I do to be able to do this???
test.setLocation(10, 0);
}

// TranslucentPanel Class...
public class TranslucentPanel extends JPanel {
private static final long serialVersionUID = 1L;

public TranslucentPanel() {
setOpaque(false);
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2d = (Graphics2D)g.create();
g2d.setComposite(AlphaComposite.SrcOver.derive(0.0f));
g2d.setColor(getBackground());
g2d.fillRect(0, 0, getWidth(), getHeight());
}
}
}

最佳答案

一种方法是放弃 Overlayout 管理器,将 TranslucentPanel 的布局管理器设置为 BorderLayout 并使用 JLabel, bg 本身就是一个容器...

bg = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/ball.png"))));
frame.add(bg);

// Set the layout of the JLabel
bg.setLayout(new GridBagLayout());
test = new JLabel("test");
test.setForeground(Color.WHITE);
// Add the test label to the bg JLabel...
bg.add(test);

就我个人而言,我不喜欢这样,因为 JLabel 在计算其首选尺寸时没有考虑组件(或布局管理器)。

就个人而言,我会创建一个负责绘制背景图像的自定义背景组件。然后,我会在上面放置其他组件,使用我需要的组件和布局管理器的任何组合来产生所需的结果。

像素完美布局是现代 UI 设计中的一种错觉。影响组件单个尺寸的因素太多,没有一个是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

关于java - 如何更改 JLabel 或我添加的任何其他组件的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25567428/

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