我最近尝试过触摸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);
}
});
}
}
答案 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()方法。