getContentPane().add(addlabell); 和Container aa = getContentPane();aa.add(addlabell); 有什么区别

本帖子已过去太久远了,不再提供回复功能。【科普】JFrame的层次结构究竟是什么样的,什么又是ContentPane?【java吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:672,359贴子:
【科普】JFrame的层次结构究竟是什么样的,什么又是ContentPane?收藏
在学习如何向 JFrame 添加控件时,很多人都会在教科书上看到这样的语句:getContentPane().add(……);然后有的人就产生了疑问,为什么要这么写呢?好像我直接写 add(……); 也可以啊?的确,现在直接写 add(……); 是可以的,但是在 java 1.4 还是更早的年代,这一句 getContentPane() 却是必不可少的,这里我就不得不吐槽一下当年的 Swing 的开发人员,明明重载一下 JFrame 的 add 方法就能解决的问题,非要我们多写这么一句……好在后来他们终于醒悟,重载了一下 JFrame 的 addImpl 方法:
protected void addImpl(Component comp, Object constraints, int index)
if(isRootPaneCheckingEnabled()) {
getContentPane().add(comp, constraints, index);
super.addImpl(comp, constraints, index);
}终于,我们不用再去 getContentPane() 了……那这个神奇的 ContentPane 究竟是什么呢?
51CTO学院11年行业品牌,1400万用户选择,中国专业IT技能学习平台,java.java资深名师授课,0基础从入门到精通,java报名与培训中心.
我们通过两个图来说明一下 JFrame 的层次结构:从视觉效果来看(从 View 层来看),一个 JFrame 的结构是这样的:可以看出,Frame 的最底层是 RootPane,然后是 LayeredPane再上面就是 ContentPane最顶层是 GlassPane最顶层的 GlassPane 默认是透明的,关于 GlassPane 这个层次,其实有很多可以利用的技巧,以后我再慢慢告诉大家,今天说我们的重点:ContentPane 可以看出,这个 ContentPane 就是默认盛放控件的那个层次,那 ContentPane 在默认的情况下又是什么呢?我们来看两个方法:JFrame 中的 getContentPane:
public Container getContentPane() {
return getRootPane().getContentPane();
}JRootPane 中的 createContentPane:
protected Container createContentPane() {
JComponent c = new JPanel();…………
}可以明显的看出,默认的 ContentPane 就是一个 JPanel,
现在我们再来看另一张图,从模型的角度来看 JFrame 的层次:可以看出,其实 ContentPane 是添加在 LayeredPane 上的一个控件。而 LayeredPane 和 GlassPane 是直接添加在 RootPane 上的,RootPane 直接添加在 JFrame 上。其实你只要记住:1、你现在不再需要去 getContentPane(),2、ContentPane 默认是一个 JPanel ,这两个结论就可以了……
技术贴,马克,手机不支持马克……
前排来支持大大
不用吐槽Swing的设计人员,Eclipse GEF 也这么设计, 实际上一个窗口是一层层的decorator堆起来的,比如滚动条什么的,你直接加东西,滚动条就无法工作了,而getContentPane,就可以直接添加到目标控件,很方便的一个实现,你不用关心到底添加到哪个区域。
。大神啊!
技术贴,其实我更想知道,jpanel怎么和jframe一起用!期待下次讲解
java多少钱?万和专注it教育24年,优秀的师资团队,雄厚的教学环境,赢得数万学子的好评,万和24年不开分支机构,只为专注教学品质,传承万和不朽品牌!
好像很厉害的样子
好难啊,不懂帮顶————来自Nokia E6-00,文艺小青年。
收藏夹快满了
其实感觉前边都是水~ 就后边2句是重点。。。
请教下司马,在JFrame中:setContentPane(new MyPanel());this.add(new MyPanel());这两句有区别吗?我以前是一直喜欢用上面那句的。
看楼主发这贴,,流泪了,,
大学的时候也tm傻了吧唧的学这些东西,研究各种资料,上班了才发现,没人用着鸟东西做什么的,,完全没用啊毕业4年的师兄劝你一句,学java就果断转服务端,还有多看看http协议,servlet规范,研究研究tomcat源码之类
难道司马要开始转型了水神变技术员?
虽然我还是看不懂,不过司马叔叔的技术帖子必须支持
现在还有多少仍然使用awt
又是技术贴,看好你哦
设置背景颜色是不是和layerdPane层有关啊?
登录百度帐号推荐应用500 - 内部服务器错误。
500 - 内部服务器错误。
您查找的资源存在问题,因而无法显示。java+sql2005 随机抽取试题的代码
代码如下: import java.awt.BorderL import java.util.*; import java.awt.event.*; import java.awt.C import java.awt.EventQ import java.sql.C import java.sql.DriverM import java.sql.ResultS import java.sql.S import javax.swing.JB import javax.swing.JF import javax.swing.JL public class Test extends JFrame { public static final String DBDRIVER=”com.microsoft.sqlserver.jdbc.SQLServerDriver”; public static final String DBURL=”jdbc:sqlserver://localhost:1433;DatabaseName=SystemTSelectMethod=Cursor”; public static final String DBUSER=”sa”; public static final String DBPASSWORD=+; public static Connection conn= public static Statement stmt= public static Statement stmt1= public static Statement stmt2= public static ResultSet rs= public static ResultSet rs1= public static void main(String args[]) { try{ //数据库的连接。 Class.forName(DBDRIVER); conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); stmt= conn.createStatement(ResultSet. TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); stmt1= conn.createStatement(ResultSet. TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); stmt2= conn.createStatement(ResultSet. TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); }catch(Exception e) { e.printStackTrace(); } Test t1=new Test(); t1.sel_save(); EventQueue.invokeLater(new Runnable() { public void run() { try { Test frame = new Test(); frame.setVisible(true); frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.exit(0); /*try{ sql_1=”delete from stu_selAns”; stmt=conn.createStatement(); rs=stmt.executeQuery(sql_1); } catch(Exception event) { }*/ } }); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame */ public Test() { super(); setBounds(100, 100, 500, 386); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle(“测试”); final Container container = new Container(); container.setLayout(null); getContentPane().add(container, BorderLayout.CENTER); label = new JLabel(); label.setBounds(22, 68, 462, 57); container.add(label); final JButton nextButton = new JButton(); nextButton.setText(“next”); nextButton.setBounds(60, 270, 106, 28); container.add(nextButton); nextButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event) { int current=Integer.parseInt(label_3.getText()); current+=1; if(current&0 &¤t&=10) { label_3.setText(“”+current); label_3.setVisible(true); sel_show(current); } label_2.setVisible(false); label_1.setVisible(false); } }); button = new JButton(); button.setText(“显示答案”); button.setBounds(224, 270, 106, 28); container.add(button); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event) { label_1.setVisible(true); label_2.setVisible(true); int current=Integer.parseInt(label_3.getText()); current+=1; try{ sql=”select sel_Ans from stu_selAns where sel_Id=”+ stmt=conn.createStatement(); rs=stmt.executeQuery(sql); while(rs.next()) { label_2.setText(rs.getString(1)); } }catch(Exception e) { } } }); label_1 = new JLabel(); label_1.setText(“正确答案是:”); label_1.setBounds(22, 199, 78, 28); container.add(label_1); label_1.setVisible(false); label_2 = new JLabel(); label_2.setBounds(106, 199, 323, 28); container.add(label_2); label_2.setVisible(false); button_1 = new JButton(); button_1.setText(“退出”); button_1.setBounds(349, 270, 106, 28); container.add(button_1); button_1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event) { dispose(); /*try{ sql_1=”delete from stu_selAns”; stmt=conn.createStatement(); rs=stmt.executeQuery(sql_1); }catch(Exception e) { e.printStackTrace(); }*/ } }); label_3 = new JLabel(); label_3.setBounds(363, 175, 66, 18); container.add(label_3); label_3.setVisible(false); label_3.setText(); } //此方法用于获取选择题的数目。 public int sel_count() { int n = 0; try{ Connection conn= Statement stmt= ResultSet rs= Class.forName(DBDRIVER); conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); sql_1=”select COUNT(selId) from sel_test where selId=1″; stmt=conn.createStatement(); rs=stmt.executeQuery(sql_1); if(rs.next()) { n=rs.getInt(1); } } catch(Exception e ) { e.printStackTrace(); }
} //此方法用于产生十道选择题的随机数。 public int[] Random() { Test st=new Test(); int n=st.sel_count(); int[] numbers=new int[n]; for(int i=0;i&numbers.i++) numbers[i]=i+1; int[] result=new int[10]; for(int i=0;i&result.i++) { int r=(int)(Math.random()*n); result[i]=numbers[r]; numbers[r]=numbers[n-1]; n–; }
} //此方法实现存取随机抽取的选择题 public void sel_save() { Test s=new Test(); int k[]=s.Random(); Arrays.sort(k); for(int i=0;i&k.i++) { System.out.println(k[i]); try{ sql_2=”select selNo,selInf,selA,selB,selC,selD,selAns from sel_test where selNo=”+k[i]; sql=” insert into stu_selAns(sel_No,sel_Inf,sel_A,sel_B,sel_C,sel_D,sel_Ans)”+sql_2; stmt=conn.createStatement(); stmt1=conn.createStatement(); rs=stmt1.executeQuery(sql); while(rs.next()) { stmt1.execute(sql); } }catch(Exception e) { e.printStackTrace(); } } //此处的FOR循环实现将试题的题号从一到十进行排列。 for(int j=0;j&k.j++) { //System.out.println(k[j]+”a”);//用于测试产生的随机数是否相同。 try{ sql=”update stu_selAns set sel_Id=”+(j+1)+”where sel_No=”+k[j]; stmt=conn.createStatement(); rs=stmt.executeQuery(sql); }catch(Exception e) { e.printStackTrace(); } } } //此方法实现选择题的调用 public void sel_show(int i) { try{ sql=”select sel_Inf ,sel_Ans from stu_selAns where sel_No=”+i; stmt=conn.createStatement(); rs=stmt.executeQuery(sql); while(rs.next()) { label.setText(rs.getString(1)); label_2.setText(rs.getString(“sel_Ans”)); } }catch(Exception e) { e.printStackTrace(); } } private S public static String sql_1; private String sql_2; private JL private JLabel label_1; private JLabel label_2; private JLabel label_3; private JB //显示答案的按钮。 private JButton button_1; } 说明:执行此程序前需先建立两张表。其中一张表是(sel_test(selNo,selA,selB,selC,selD,selAns)),另一张表是(stu_selAns(sel_No,sel_A,sel_B,sel_C,sel_D,sel_Ans) 此张表用于保存从表sel_test
中随机抽取的题目。 此程序是大概思路是:先从题库中随机抽取十道题,然后将其保存在另一张表中并将其相应的题号变为一到十。便于接下来的其他操作。
相关文章:
暂时还没有评论.

我要回帖

更多关于 openlayers addlabel 的文章

 

随机推荐