代码如下:
import java.awt.*import java.awt.event.*
import javax.swing.*
public class GraExp extends JFrame
{
CInstead c1=new CInstead()
Container c
JLabel lbl1=new JLabel("姓名:" )
JLabel lbl2=new JLabel("密码:" )
JTextField tf1=new JTextField(10),
tf2=new JTextField(10)
public GraExp()
{
setContentPane(c1)
c=getContentPane()
c.setLayout(new FlowLayout(FlowLayout.LEFT))
c.add(lbl1)
c.add(tf1)
c.add(lbl2)
c.add(tf2)
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE)
setSize(new Dimension(400,300))
show()
}
public static void main(String[] args)
{
GraExp ge=new GraExp()
}
class CInstead extends JPanel
{
ImageIcon icon
Image img
public CInstead()
{
icon=new ImageIcon(GraExp.class.getResource("333.png" ))
img=icon.getImage()
}
public void paintComponent(Graphics g)
{
super.paintComponent(g)
g.drawImage(img,0,0,null )
}
}
}
程序分析:
JComponent.paint先绘制组件,然后绘制组件的边框,再绘制组件的子组件。调用的顺序确保组件、边框和子组件都是可视的。如果组件有一个 UI代表,则JComponent.paintComponent调用该代表的Update方法,该方法为不透明组件擦除背景,然后绘制组件。
CInstead是一个不透明的组件,如果重载paint方法,其背景图是无法被擦除的,因此,即使更新了组件的所有包含组件,在界面上是看不到的。所以必须重载paintComponent方法,在绘制子组件前先擦除背景。
对双缓存组件,paint方法负责把组件绘制到屏外缓存中,然后把屏外缓存拷贝到组件的屏上代表中,正因为如此,不建议为Swing组件重载paint,如果需要重新定义如何绘制组件,那么就重载paintComponent()。
1.首先一个小错误,这些代码(包括你建立第一个JFrame的代码)最好都放到Swing的线程去,不然可能会偶尔发生意外错误。就是这样:SwingUtilities.invokeLater(new Runnable() {@Override public void run() {...在这里写的代码会在Swing线程又叫做EDT里执行...} })
2.Swing里可以用LayoutManager,个人感觉比你一个一个手动设置Bound方便和灵活。
3.然后,一般改成:fr.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)而不是exit,exit比较粗鲁会终止整个程序,dispose只是终止窗口并在所有窗口都结束而且主线程也结束才终止程序。
4.getClass().getResource一般用在做成JAR之后,从同一个JAR里取数据,可以用比较简单的Toolkit.getDefaultToolkit().getImage()
5.你已经知道JLabel可以附带图片了。如果你要的效果是图片之上显示东西,这里你心里有了“层”的概念,而这个概念在Swing里的一个实现是JLayeredPane,去学习这个容器吧。给你个大概的例子:
JLayeredPane layers = new JLayeredPane()//创建JPanel paneBackground = new JPanel(new BorderLayout())//背景层
paneBackground.add(new JLabel(Toolkit.getDefaultToolkit().getImage("C:/1.jpg")), BorderLayout.CENTER)//加入背景图片,BorderLayout.CENTER单独使用表示填满。
JPanel paneDetails = new JPanel(new FlowLayout())//这层你往里面加东西,就在背景上面了。
paneDetails.add(new JButton("ABC"))//加个按钮试试。
layers.add(paneBackground)layers.add(paneDetails)//把层按照从背后向前的顺序加进去。
fr.add(layers, BorderLayout.CENTER)//把layers加进frame里面去,填满。
纯手写代码笔误难免哦~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)