我最近尝试触摸GUI编程,实际上这个概念很简单。但是我遇到了一个小错误。我的jpanel上添加的jlabel没有显示。我称为validation and Repaild,但两者都没有显示。
代码正在使用秋千和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);
}
});
}
}
不要覆盖绘画方法以在组件上设置属性。
您创建组件,然后设置其属性:
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(...)
,这意味着该标签需要定义为类中的实例变量。
阅读有关如何编写componentListener的示例代码以使您启动的部分。
请注意,jpanel的建议相同。不要覆盖油漆()只是为了设置面板的背景。创建面板后只需调用setbackground()方法。
如果使用jlabel的油漆方法创建文本,它不会使用该文本来大小本身,并且标签的大小将保持0 x0。setText(...)
设置文本的方法。无论如何,您几乎永远都不想覆盖秋千组件的油漆方法,只有偶尔才会覆盖paintcomponent方法。