【问题标题】:JLabel does not fully allign with JFrameJLabel 与 JFrame 不完全对齐
【发布时间】:2017-05-26 15:23:43
【问题描述】:

我有一个 JFrame,顶部有一个名为“coloredLabel”的 JLabel,它所在的类的一个实例正在它们两者上运行。随机数量的对象在框架和标签上移动,并且不直接与它们交互。 唯一的问题是标签上方有一些可见的框架,我想要的是标签与框架完全对齐,而不粘贴对象(使用覆盖绘制方法绘制并被称为“游戏.newBall”和“game.moveBall”。“test”是类的名称。 这是我的主线程的外观,其中声明了框架和标签:

public static void main(String[] args) throws InterruptedException {
    JFrame frame = new JFrame("Bounce 2.0");
    JLabel coloredLabel = new JLabel("");
    test game = new test();
    frame.add(game);
    frame.setSize(300, 400);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    coloredLabel.setOpaque(true);
    coloredLabel.setBackground(game.backgroundColor);
    coloredLabel.setPreferredSize(new Dimension(1000000,1000000));
    frame.getContentPane().add(coloredLabel,BorderLayout.LINE_START);
    game.add(coloredLabel);

    for(int a = randInt(0,9); a<10; a++)
        game.newBall(randInt(0,300),randInt(0,400));

    while (true) {
        double height = frame.getContentPane().getSize().getHeight();
        double width = frame.getContentPane().getSize().getWidth();
        int n = 0;
        while(game.exists(n)==true){
            game.moveBall(n,width,height);
            n++;
        }
        game.repaint();
        Thread.sleep(10);
    }
}

所以我的问题是: 如何将 JLabel 与 JFrame 对齐?所以 JLabel 和框架之间没有空间。

我在这个网站上搜索了这个,但找不到相同的问题或足够相似的东西,所以我可以解决这个问题。

  • 已解决 - game.setBackground(...);

【问题讨论】:

  • 你能用JLabelJFrame重现这个问题吗?
  • 1) “使用覆盖绘制方法绘制” 您应该覆盖paintComponent(...),而不是paint(...)。 2)while(true) { 那条线会伤害你,而不是和Thread.sleep(10); 一起帮助你,而是使用Swing Timer 或者你可能会阻塞 EDT(你可能会因为你没有正确初始化你的应用程序)(做如本文末尾所示answer)
  • 3) 在您完成向其中添加所有元素之前,您已经让您的JFrame 可见。它也可能导致奇怪的行为,这一行 frame.setVisible(true); 应该是你程序中的最后一行。 4)你到底为什么要创造这么大的JLabel??? coloredLabel.setPreferredSize(new Dimension(1000000,1000000)); 5) 与最后一点有关,见Should I avoid the use of setPreferred|Maximum|MinimumSize()? 普遍共识说是...
  • ...并改写 getPreferred|Maximum|MinimumSize() 方法。 6)为什么每次都计算这个变量?为什么不将它们作为成员变量? double height = frame.getContentPane().getSize().getHeight(); double width = frame.getContentPane().getSize().getWidth();, 7) 这个while(game.exists(n)==true){ 可以简化为:while(game.exists(n))。为了获得更好的帮助,请尽快发布一个有效的 minimal reproducible example 来证明您的问题。
  • 而您将 coloredLabel 添加到 2 个位置:frame.getContentPane().add(coloredLabel,BorderLayout.LINE_START);game.add(coloredLabel); 这是不正确的,Swing 只会将其添加到最后添加的位置,因此,第一行那么就不需要了……

标签: java swing jframe jlabel paint


【解决方案1】:

唯一的问题是标签上方有一点可见的框架,

game.add(coloredLabel);

我猜“游戏”是 JPanel。默认情况下,JPanel 使用FlowLayout,默认情况下FlowLayout 具有 5 个像素的水平和垂直间隙。

摆脱FlowLayout中的空白。阅读 FlowLayout 的构造函数/方法的 API 以自定义其行为。

当然,更大的问题是应用的设计。我不明白您使用标签并试图占用框架的所有空间的观点。只需使用以下命令设置游戏面板的背景:

game.setBackground(...);

类名也应该:

  1. 以大写字符和
  2. 开头
  3. 是描述性的。

"test" 两者都不是。

【讨论】:

  • test是类名,只是为了测试,它的原名是“Bounce2”,game.setBackground(...);成功了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2014-06-01
相关资源
最近更新 更多