java JLabel不会重新定位

时间:2015-02-09 13:52:58

标签: java swing

我想将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);

                }
            });
        }
    }

4 个答案:

答案 0 :(得分:2)

如果需要整齐的布局,则必须使用布局管理器。其中有很多,包括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。

答案 1 :(得分:1)

实现目标的最简单方法是使用 WindowBuilder ,这是Eclipse的插件(https://eclipse.org/windowbuilder/)。

首先从可用布局列表中选择 GroupLayout

然后将jLabel放在jButton上方并选择" 锚定底部"。该插件将为您生成代码。

enter image description here

答案 2 :(得分:1)

使用布局,卢克! :)我喜欢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));
    }
}

答案 3 :(得分:0)

setLocationsetSize不应由您(框架的用户)调用。它们应由布局管理器调用,该布局管理器与组件的容器相关联。

您可以在Java网站上找到有关布局管理如何工作的全面详细信息:http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

为了获得你想要的东西,SpringLayout似乎更合适。

作为替代方案,如果您想直接致电setLocationsetSize,则应删除布局管理器,方法是将其设置为null