【问题标题】:.setBounds not working for JLabel and JButton.setBounds 不适用于 JLabel 和 JButton
【发布时间】:2013-06-20 07:51:29
【问题描述】:

我正在尝试更改我的 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();
}
}

我为所有的进口道歉,我真的不知道我需要哪些,哪些是毫无意义的。

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

【问题讨论】:

  • 这是我喜欢 Eclipse 的一件事;它会找出你需要的导入并为你添加它们。
  • 不要使用 setBounds() 来设置组件的大小和位置。让布局管理器完成它的工作。那就是如果事实正在发生的事情。 JPanel 使用 FlowLayout,因此组件的定位基于 FlowLayout 的规则。
  • 1) 通常,避免导入整个包 (import awt.*),因为这是不好的做法,2) 如果它们来自 Java API,您可以像大多数人一样将它们排除在外已经知道这些课程了。
  • 我喜欢 SSCCE 中包含的导入,因为我不使用 IDE,也不喜欢自己输入它们。
  • 请学习java命名约定并遵守它们。

标签: java swing jbutton jlabel layout-manager


【解决方案1】:

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

让布局管理器完成它的工作。那就是如果事实正在发生的事情。 JPanel 使用FlowLayout,因此组件的定位基于 FlowLayout 的规则。如果需要,您可以更改 FlowLayout 以将组件向左对齐。或者您可以使用不同的布局管理器。

阅读Layout Managers 上的 Swing 教程,找到您可以使用的其他布局管理器。

【讨论】:

  • 我做到了,使用 .setLayout(null);我知道这是“不好的做法 blahedeblah”,但我想创建一个自定义 GUI。
  • @JamesLoughlin,这不是您创建自定义 GUI 的方式!!绝对没有理由这样做。您可以使用许多不同的布局管理器在面板上定位两个组件。花时间学习好的编程实践而不是糟糕的编程实践。
  • @Cornelius,布局管理器当然工作。当然,您需要比I would like some help on how to change the positioning of my components. 更好的要求,然后我们才能就使用哪个布局管理器(或布局管理器的组合)给出更好的答案。每个要求都不同。
  • 不,真的,我已经尝试过所有 Swing 管理器和几个第三方管理器,我可以说它们是纯粹的垃圾。给我一个布局管理器,它可以在不到 100 行代码中完成 thisthis,我承认他们确实管理了一些东西。
  • @Cornelius,你为什么要发表如此荒谬的评论?鉴于这个问题的上下文 - 定位标签和按钮,您绝对会使用布局管理器。如果您无法找出布局管理器来定位这两个组件,那么您显然不了解布局管理器。如果您还有其他一些奇怪的要求,请提出一个适当的问题来说明实际要求。这篇文章中问题的答案是使用布局管理器。
【解决方案2】:
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 的位置。

【讨论】:

  • -1 虽然在技术上是正确的,但它传播了 gui 开发中最糟糕的做法
  • 这就是他想知道的。他应该花时间学习最好的编程实践,但他也必须知道最差的实践。通过以一种糟糕的方式写作,他有一天会理解为什么它以一种糟糕的方式编写,然后他就会明白避免这种特殊的不良做法的必要性。
  • 这有助于解决我的问题!尽管如此,这是不好的做法。感谢直接回答 OP 问题的贡献者。
猜你喜欢
  • 1970-01-01
  • 2021-09-28
  • 2022-06-10
  • 1970-01-01
  • 2015-10-29
  • 2017-03-22
相关资源
最近更新 更多