Java .setBounds不适用于JLabel和JButton

Java .setBounds不适用于JLabel和JButton,java,swing,jbutton,jlabel,layout-manager,Java,Swing,Jbutton,Jlabel,Layout Manager,我正在尝试更改GUI上JLabel和JButton的位置。即使我尝试使用.setBounds来更改其位置;它们都只是出现在屏幕的顶部中间 import java.awt.color.*; import java.awt.font.*; import java.awt.Graphics; import java.awt.Image; import javax.swing.*; import javax.swing.*; import java.awt.event.*; import java.aw

我正在尝试更改GUI上JLabel和JButton的位置。即使我尝试使用.setBounds来更改其位置;它们都只是出现在屏幕的顶部中间

import java.awt.color.*;
import java.awt.font.*;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.UIManager.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class yo implements MouseListener {

Image image;
JButton button = new JButton("Wassup");
JFrame frame = new JFrame();
JLabel heloo = new JLabel("yo");
JPanel panel = new JPanel()
{
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        ImageIcon i = new ImageIcon("hi.jpg");
        image = i.getImage();
        g.drawImage(image,150,150,null);
        g.drawString("Hello",100,100);
        g.drawString("Hi",50,50);
    }
};


public yo()
{
    frame.add(panel);
    frame.setTitle("Hello");
    frame.setSize(500,500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    panel.add(heloo);
    panel.add(button);
    button.setBounds(200,100,200,100);
    heloo.setBounds(100,100,100,100);
    button.addMouseListener(this);
}

public void mouseClicked (MouseEvent event)
{
    heloo.setText(String.format("Clicked at %d,%d", event.getX(), event.getY()));
}
public void mouseEntered (MouseEvent Event){}
public void mouseExited (MouseEvent Event){}
public void mousePressed (MouseEvent Event){}
public void mouseReleased (MouseEvent Event){}

public static void main(String[] args)
{
    new yo();
}
}
我为所有的进口产品道歉,我真的不知道我需要哪些,哪些是毫无意义的

基本上,我需要一些关于如何更改组件位置的帮助。

不要使用setBounds()设置组件的大小和位置

让布局管理器完成它的工作。这就是正在发生的事实。JPanel使用
流程布局
,因此组件将根据流程布局的规则进行定位。如果需要,可以更改FlowLayout以向左对齐组件。也可以使用不同的布局管理器

阅读上的Swing教程以查找其他可以使用的布局管理器

public yo() {
    frame.add(panel);
    frame.setTitle("Hello");
    frame.setSize(500,500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    panel.setLayout(null);
    panel.add(heloo);
    panel.add(button);
    button.setBounds(200,100,200,100);
    heloo.setBounds(100,100,100,100);
    button.addMouseListener(this);
}

通过将JPanel的布局设置为null,它将处于“绝对布局”,然后您将能够使用setBounds()设置JLabel和JButton的位置

这是我喜欢日食的一点;它会找出您需要的导入内容并为您添加。不要使用setBounds()设置组件的大小和位置。让布局管理器完成它的工作。这就是正在发生的事实。JPanel使用FlowLayout,因此组件是根据FlowLayout的规则定位的。1)一般来说,避免导入整个包(
import awt.*
),因为这是一种不好的做法;2)如果组件来自Java API,你可以不考虑它们,因为大多数人都知道这些类。我喜欢SSCCE中包含的导入,因为我不使用IDE,也不喜欢自己键入它们。请学习java命名约定并坚持它们。我是使用.setLayout(null)实现的;我知道这是“糟糕的做法”,但我想创建一个自定义GUI。@JamesLoughlin,这不是创建自定义GUI的方式!!绝对没有理由这样做。有许多不同的布局管理器可用于在面板上定位两个零部件。花时间学习好的编程实践,而不是坏的编程实践。@Cornelius,布局经理当然会工作。当然,您需要一个比-
更好的要求。在我们给出使用哪个布局管理器(或布局管理器组合)的更好答案之前,我需要一些关于如何更改组件位置的帮助。
。每个要求都是不同的。不,真的,我试过每一个Swing manager,还有几个第三方的,我可以说它们都是垃圾。给我一个布局管理器,它能在不到100行的代码中完成或完成任务,我承认它们真的能管理一些东西。@Cornelius,你为什么要做出如此荒谬的评论?考虑到这个问题的上下文,即定位标签和按钮,您绝对会使用布局管理器。如果您无法找到布局管理器来定位这两个组件,那么您显然不了解布局管理器。如果你有其他奇怪的需求,那么问一个适当的问题,说明实际的需求。这篇文章中的问题的答案是使用布局管理器。-1虽然技术上正确,但它传播了gui开发中最糟糕的实践,这正是他想知道的。他应该利用时间学习最好的编程实践,但他也必须知道最坏的实践。通过写得不好,有一天他会理解为什么写得不好,然后他会理解避免这种不良行为的必要性。这有助于解决我的问题!虽然是的,但这是个坏习惯。感谢直接回答OP问题的投稿人。