Swing学习笔记(杂乱的知识点随手记)

来源:互联网 发布:win7电脑连接网络 编辑:程序博客网 时间:2024/06/17 06:50

1、用于写文本的有很多:JTextFieldJTextAreaJLabelJEditorPane等等,注意,这些都是类名,这些类是已经写好的,是Java的类库中自带的,直接用就可以,比如可以直接用这些类名定义引用型变量,或者实例化对象,或者调用静态方法。

2、在javax.swing包中,有两种类型的组件:顶层容器(JframeJappletJDialogJWindow)和轻量级组件。

基本组件:按钮(JButton)、标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等;

高层组件:表格(JTable)、树(JTree)等;

3、在Java中,通常把Field翻译为,比如JTextField翻译为文本域。而JTextArea翻译为文本区

4、在计算机网络中,通常把domain翻译为,比如域名。

5JTextField仅支持单行文本。

6JTextAreaJLabelJEditorPane均支持多行文本。

7、它们实例化产生的都是文本框(或者叫文本区域),只是外表和功能略有区别。

8、初始化文本框的文字通常有2种方法,一种是直接给构造方法传参字符串,另一种是调用setText方法,给该方法传参字符串。

9JLabel文本框不可编辑文本(是在程序中定死的),所以背景颜色和所在容器相同。

10JTextFieldJTextAreaJEditorPane文本框默认可编辑文本,所以背景颜色(即文本区域的颜色,即编辑区域的颜色)默认为白色。

11setEditable(false):如果想要显示不可编辑的固定文本,通常调用的方法名为setEditable,参数给false即可置为不可编辑。

12setBackground(getBackground()):如果想要设置背景颜色,通常调用方法setBackground,给它传参颜色对象即可。可用getBackground方法得到所在容器的背景颜色对象,作为参数传给setBackground,这样就可使该文本框背景颜色与所在容器背景颜色相同。

13JTextField文本框显示出来能看到细细的边框(即使与容器颜色相同且不可编辑),而JLabelJTextArea文本框完全与所在容器融为一体,看不出界限在哪。

14、设置文本对齐方式有特定的方法,而想要使组件排列对齐,那最好让每一小块都是相同类型的面板/组件,否则常常会有细微的偏差对不齐,这会让强迫症同学抓狂的。

15eclipse某行前面有×的时候,把鼠标放上面即可查看是什么错误,注意要尝试去看懂(即使查字典也要弄懂那行英文说的啥)。

16、解决错误的一个重要方法:eclipse某行前面有×的时候,注意要记得去单击这个×,会列出几个解决方案,点击其中某个方案即有可能自动解决错误。

17、一个界面中有很多文本和组件时,首先找出可以作为最小单元的那种模块,大的模块都是由它组成。这些最小单元之间可以稍有不同,用构造方法重载实现不同的最优单元,重载的构造方法之间也可以相互调用,这个也是经常用到的。

18Swing做界面的面向对象设计思想:将最小单元设计成一个类,然后再将稍大的模块设计成一个类,其中add了很多最小单元,然后再将更大的模块设计成一个类,其中add了很多稍大的模块,以此类推。最后再add到一个JFrame类中即可。

19、在构造方法中写涉及本类对象的操作,用this关键字,常用的比如this.add(…);是用本类对象调用父类方法,该类一定是继承了JPanelJFrame

20Swing中设计的类基本都是一个要显示出来的东西,所以写这个类时要extends JPanel。要想显示出界面,就必须继承JFrameJPanel也是继承JFrame的)。

21JFrame对象实例化之后并不能看到界面,因为它默认不可见::>_<::所以要记着加一句.setVisible(true);这样人才能看得到。

22pack();这一句只能给JFrame对象使用,不能给JPanel对象。

23、在构造方法中写涉及本类对象的操作的语句时,可以不写对象名,即不写this,直接写方法,比如this.add(…);可以写成add(…);,主方法中frame.add(…)也可以写成add(…);

24、中英文标点的错误比如,写成了,或者;写成了;诸如此类,这种低级错误往往被忽视,但有时可能因此耽误很多时间。所以要迫使自己查字典看懂那行英文的错误提示。

25JLabel文本控件可以在实例化的同时指定文本的对齐方式new JLabel(“某系统”,JLabel.CENTER);

26、各个控件之间留出任意指定宽度的间隙:

//定义topPanel的布局为BoxLayoutBoxLayout为垂直排列

topPanel.setLayout(newBoxLayout(topPanel, BoxLayout.Y_AXIS));

//先加入一个不可见的Strut,从而使 topPanel 对顶部留出一定的空间

topPanel.add(Box.createVerticalStrut(10));

//加入包含表格的滚动窗格

topPanel.add(scrollPane);

//再加入一个不可见的Strut,从而使topPanelmiddlePanel之间留出一定的空间

topPanel.add(Box.createVerticalStrut(10));

27JButton也可以作为文本控件,因为按钮上本来就可以写字,现在只要把它这个功能去掉,就完全是文本控件了。用自带方法setEnable(false)即可。

28、通常,在JFrameadd一个JPanel,然后把其他所有要做的东西都加在这个panel上,这样可以避免某些奇怪的问题。

29、把JFrame的布局置为FlowLayout,这样可以在用鼠标拖动边框改变界面大小时,内部的控件位置不随之改变。

30、文本对齐:在BorderLayout下,使用newJLabel(“某系统”,JLabel.Right);并不能使文本居左或居右,无论left,center还是right都会居中。在GridLayout下,JLabel可以指定居左、居中或居右。

31、决定控件大小的因素有2个:处于哪种布局和setSize之类的方法。布局的决定权更大。比如一个面板上有多个大组件,每个大组件内有多个小组件。若面板采用FlowLayout,则小组件会保持默认大小,而小组件越多,所在的大组件越大。若面板采用GridLayout,则每个大组件占满一格,无论里面多少小组件,都保持一格那么大,而里面的小组件越多,小组件就越小。

32CardLayout:把卡片所处的panel设置为CardLayout,注意,不包括用于切换卡片的按钮,仅仅是卡片。

33、使用另一个包中的类,需要写import.;

34GridLayout的常见的实用的用法:panel.setLayout(new GridLayout(0,1,0,10));

第一、二个参数代表行、列,两者至多有一个为0,当为0时,代表从0/列开始增长的可变的行/列。第三、四个参数代表各格子之间行/列间距。

35CardLayoutcard = new CardLayout();然后card有几种常用的用法,card.next(卡片容器名);card.previous(卡片容器名);card.show(卡片容器名,指定的卡片的字符串标签名);

36、在向面板中add组件时,可以同时给该组件贴一个标签,该标签是字符串类型。举个栗子:cardPanel.add(“1”,card1);35card.show就必须使用字符串标签,举例:card.show(cardPanel,“1”);

37、需要用到数组、二维数组的使用场景:当一个界面中某一类东西个数很多,而且希望个数可以不确定,以后可以方便地改变个数。通常个数很多就是有多行多列,通常是多个文本或多个按钮。

38若要在按钮数组中,为其中的每个按钮注册一个监听器(即添加一个响应),每个按钮对应不同的响应。

方法一:一个一个单独添加响应。

方法二:设计循环让每个按钮添加相同的监听器,在响应中写switch语句或多个if语句,判断出事件是从哪个控件来的,然后做出相应的响应。

方法三:如果每个响应之间的区别可以用i体现,所有响应可以用i写成统一的形式,那么设计循环让每个按钮添加相同的监听器,在响应中写循环,在响应中的循环中再写一个if语句,判断出事件是从哪个控件来的,然后做出相应的响应。举例:在卡片布局中常用(卡片的字符串标签做成数组):

     for(inti=0;i<btStr.length;i++) {

          bt[i] =new JButton(btStr[i]);

          bt[i].addActionListener(new ActionListener(){

             public voidactionPerformed(ActionEvent e) {

                 for(inti=0;i<bt.length;i++) {

                    if(e.getSource()==bt[i]){

                        card.show(cardPanel,cardName[i]);

                        break;

                    }

                 }

             }

          });

         panel.add(bt[i]);

      }

显然,方法三的效率低于方法二,且必须所有的响应要能用i统一地表示出来,但是,当数组中的按钮个数是不确定的,需要改变个数时,使用方法三更方便。

39、匿名对象的使用要慎重,要确保只需使用当前这一次,以后不会再用到。如果后面可能用该对象进行一些操作,那么一定不能匿名。

40、Java和C++的一个区别:C++中函数内部可以定义函数(称为内嵌函数),Java中方法内部不可以定义方法。

41、Java中数组定义时要么静态初始化,要么动态初始化,要么不初始化。不可以同时使用静态和动态初始化。

42、设一个类中有重载构造方法A和B,A中没有调用成员变量c,调用了B,B中调用了成员变量c。此时,用B实例化的对象可以直接调用成员变量c,用A实例化的对象无法直接调用成员变量c,而需要通过B实例化的对象的引用间接调用成员变量c(给该类增加一个引用类型的成员变量,用B实例化对象赋给它)。举例说明如下:

public classUnit extends JPanel {

    public JEditorPaneeditorPane = new JEditorPane();

    public Unit(Stringleft,String up)throws IOException {

       …………………………

       add(leftText);

       add(new Unit(up));

    }

public Unit(Stringup) throws IOException {

       ……………………………

       add(upText);

       add("",editorPane);

    }

}

上述情况下,假设unit[0]=new Unit(“le”,“ha”);则unit[0]无法调用editorPane,不可以直接调用,即paramSet.wSite[0].strip[0].unit[0].editorPane.setText(“hello”);无效。

public classUnit extends JPanel {

    public JEditorPaneeditorPane = new JEditorPane();

    public Unitut;

    public Unit(Stringleft,String up)throws IOException {

       …………………………

       ut = new Unit(up);

       add(leftText);

       add(ut);

    }

public Unit(Stringup) throws IOException {

       ……………………………

       add(upText);

       add("",editorPane);

    }

}

上述情况下,假设unit[0]=new Unit(“le”,“ha”);则unit[0]可以通过ut调用editorPane,不可以直接调用,即paramSet.wSite[0].strip[0].unit[0].ut.editorPane.setText(“hello”);有效。paramSet.wSite[0].strip[0].unit[0].editorPane.setText(“hello”);无效。


0 0
原创粉丝点击