【问题标题】:JLabel Wont Go Where I Want In JPanelJLabel 在 JPanel 中不会去我想去的地方
【发布时间】:2017-01-01 17:02:59
【问题描述】:

我想在我的JPanel 中添加一个JLabel,但它不会将它定位在我想要的位置。我将我的 layoutManager 设置为 null 并且没有用。

我正在尝试将JLabel 放在JFrame 的左下角。窗口的KeyListener 是为了让我可以使用退出键关闭窗口。

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Window extends Canvas {
    private static final long serialVersionUID = 1L;
    public Window(int width, int height, String title, Game game) {
        // Start: Code For Window Elements
        // Create Font That Is Used In Elements
        Font font = new Font("SansSerif", Font.PLAIN, 12);
        // JLabel For Author And Game Name
        JLabel name = new JLabel();
        name.setVisible(true);
        name.setText("\"Cube\" By: Toxicminibro");
        name.setFont(font);
        name.setForeground(Color.white);
        name.setBounds(0, 0, width, height);
        name.setLocation(5, 0);
        // End: Code For Window Elements
        // Create The JPanel, Set Its Attributes, And Add Elements To JPanel
        JPanel panel = new JPanel();
        panel.setVisible(true);
        panel.setLayout(null);
        panel.setBounds(0, 0, width, height);
        panel.setBackground(Color.DARK_GRAY);
        panel.add(name);
        panel.validate();
        // Create The Window And Set Its Attributes
        JFrame frame = new JFrame(title);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(width, height));
        frame.setMaximumSize(new Dimension(width, height));
        frame.setMinimumSize(new Dimension(width, height));
        frame.setLayout(null);
        frame.validate();
        frame.add(panel);
        frame.pack();
        // Window KeyListener
        KeyAdapter listener = new KeyAdapter() {
            @Override public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    frame.dispose();
                }
            }
        };
        frame.addKeyListener(listener);
    }
}

【问题讨论】:

  • panel.setLayout(null); 通过将其添加到您的代码中,您声明:“摆脱所有如何在 GUI 中放置和组织元素的东西,我是终极大师并且比任何人都清楚!”。由于这很少是真的,我建议通过公共教程了解 LayoutMangers 以及如何使用它们:docs.oracle.com/javase/tutorial/uiswing
  • 您的代码有许多问题表明您没有充分利用 Swing,包括使用 null 布局、在首选键绑定的情况下使用 KeyListener、混合 Swing 和 AWT (Canvas)组件,...请考虑通过 Swing 教程来学习如何更好地使用这个库。这样做不会输。

标签: java swing


【解决方案1】:

在这里,您将label 的背景(容器)设置为与Jframe 相同的大小,这就是它覆盖整个屏幕的原因,Alignment 位于left-center 默认情况下,解决方法:

//Set a new size to your Label (A size large enough to display the entire text)
name.setSize(AnotherWidth,AnotherHeight);

【讨论】:

  • 请注意,您应该不惜一切代价避免 setBounds。它鼓励您在没有布局管理器的情况下工作,而这对于 Swing 程序来说永远不会结束。
  • 我没有说相反的意思,但在这里我只是指出问题的原因,但我感谢您提供这些信息!
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多