标签不显示在面板上(重新绘制并验证已尝试)

时间:2016-12-17 17:05:15

标签: java swing user-interface graphics

我最近尝试过触摸GUI编程,实际上这个概念非常简单。但是我遇到了一个小错误。我的JPanel上添加的JLabel没有显示。我已经调用了Validate和Repaint,但两者都没有显示。

代码使用SWING和awt进行事件处理。

以下是我为解决这个问题而编写的非常快速的代码:

    package com.first;

    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.Graphics;

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

    public class wraith
    {
            public static void main(String[] arg)
            {
                    EventQueue.invokeLater(new Runnable()
                    {
                        @Override
                        public void run() 
                        {
                            JFrame frame = new JFrame("Wraith, the game");
                            JPanel panel = new JPanel()
                            {

                                /**
                                 * 
                                 */
                                private static final long serialVersionUID = 1L;

                                @Override
                                public void paint(Graphics g) {
                                    super.paint(g);
                                    this.setBackground(new Color(0f,0f,0f,1.0f));
                                }   

                            };
                            JLabel label = new JLabel()
                            {

                                /**
                                 * 
                                 */
                                private static final long serialVersionUID = 1L;

                                @Override
                                public void paint(Graphics arg0) 
                                {
                                    super.paint(arg0);
                                    this.setForeground(Color.WHITE);
                                    this.setText("Width: " + frame.getWidth() + " Height: " + frame.getHeight());
                                    this.setHorizontalAlignment(LEFT);
                                    this.setVerticalAlignment(TOP);
                                }

                            };
                            frame.setSize(500, 500);
                            frame.add(panel);
                            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                            panel.add(label);
                            panel.validate();
                            frame.setVisible(true);
                        }

                    });
            }
    }

2 个答案:

答案 0 :(得分:2)

如果您使用JLabel的paint方法创建其文本,它将不会使用该文本来自行调整大小,并且标签的大小将保持为0 x 0.因此,请使用JLabel的setText(...)方法进行设置文本。你几乎从不想要覆盖Swing组件的paint方法,只是偶尔会覆盖paintComponent方法。

答案 1 :(得分:2)

不要覆盖绘制方法以在组件上设置属性。

您创建组件,然后设置其属性:

JLabel label = new JLabel("...");
label.setForeground(Color.WHITE);
label.setHorizontalAlignment(JLabel.LEFT);
label.setVerticalAlignment(JLabel.TOP);
  

我应该如何更新我的标签

this.setText("Width: " + frame.getWidth() + " Height: " + frame.getHeight());

如果要动态显示框架的宽度/高度,则应使用侦听器通知标签更改。在这种情况下,您将使用ComponentListener并处理componentResized(...)方法。所以基本上在componentResized(...)方法中使用label.setText(...),这意味着标签需要在类中定义为实例变量。

阅读How to Write a ComponentListener上的Swing教程中的部分示例代码,以帮助您入门。

注意,JPanel的建议相同。不要覆盖paint()只是为了设置面板的背景。只需在创建面板后调用setBackground()方法。