[英]java JLabel won't reposition
我想将我的jLabel设置在jButton之上。 实际上,如果它们只是“漂浮”在彼此之上会是理想的。
Jet,我无法显示标签,因为它停留在按钮下方。 我一直在谷歌搜索和尝试诸如setLocation之类的事情,但无济于事。 我确定这是我所缺少的超级基础...
public class TranceExperiment extends JFrame {
public TranceExperiment() {
setTitle("Simple example");
setSize(600, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TranceExperiment ex = new TranceExperiment();
ex.setVisible(true);
//set startLabel
JLabel expText = new JLabel("Welcome to the experiment");
ex.add(expText);
expText.setLocation(200,200);
//expText.setSize(100, 100);
expText.setVisible(true);
// expText.setLayout(null);
ex.add(expText);
//start Button
final JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
//do stuff
startButton.setText("Continue");
}
});
ex.add(startButton);
}
});
}
}
如果需要整齐的布局,则必须使用布局管理器。 其中包括FlowLayout,BorderLayout和GridLayout 。 我建议针对此特定问题使用GridLayout,例如:
ex.setLayout(new GridLayout(3,1));
3是行,1是列。 在将按钮和标签添加到框架之前,请插入此行。
编辑:
您还可以将JPanel添加到框架中,然后将面板的布局设置为GridLayout,如下所示:
ex.setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3,1));
panel.add(startButton);
ex.add(panel, BorderLayout.NORTH);
通过使用BorderLayout ,可以将面板放置在框架中的任何位置。 只需记住设置面板和/或框架的尺寸,并在面板上添加其他标签即可。 BorderLayout有一些设置可供您使用,包括SOUTH,CENTER,EAST和WEST。
实现目标的最简单方法是使用WindowBuilder ,这是Eclipse的插件( https://eclipse.org/windowbuilder/ )。
首先从可用布局列表中选择GroupLayout 。
然后将jLabel
放在jLabel
上方,然后选择“ jButton
Bottom ”。 该插件将为您生成代码。
使用布局,卢克! :)我喜欢GridBagLayout,因为它非常灵活。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
final JFrame frame = new JFrame();
frame.setTitle("Simple example");
frame.setSize(600, 400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLayout(new BorderLayout());
JPanel contentPanel = new JPanel(new GridBagLayout());
frame.add(contentPanel);
JLabel expText = new JLabel("Welcome to the experiment");
expText.setPreferredSize(new Dimension(150, 40));
expText.setVisible(true);
final JButton startButton = new JButton("Start");
startButton.setPreferredSize(new Dimension(450, 40));
startButton.setPreferredSize(new Dimension(450, 40));
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
startButton.setText("Continue");
}
});
contentPanel.add(expText, new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.NORTHWEST,
GridBagConstraints.HORIZONTAL, new Insets(0, 200, 0, 100), 0, 0));
contentPanel.add(startButton, new GridBagConstraints(0, 1, 1, 1, 1, 0, GridBagConstraints.NORTHWEST,
GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
contentPanel.add(Box.createVerticalGlue(), new GridBagConstraints(0, 1, 2, 2, 1, 1,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
}
}
setLocation
和setSize
并非由框架的用户您调用。 它们由与组件的容器关联的布局管理器调用。
您可以在Java网站上找到有关布局管理如何工作的全面而详细的信息: http : //docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
要获得所需的内容, SpringLayout
似乎更合适。
或者,如果您要直接调用setLocation
和setSize
,则应通过将布局管理器设置为null
来删除它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.