java的卡片式对话框
在本章的前部,向我们先容了老式的CardLayout,而且留意到我们奈何去打点我们所有的卡片开关。有趣的是,有人此刻认为这是一种不错的设计。幸运的是,Swing用JTabbedPane对它举办了修补,由JTabbedPane来处理惩罚这些卡片,开关和其它的任何事物。比拟CardLayout和JTabbedPane,我们会发明惊人的差别。
下面的措施例子十分的有趣,因为它操作了前面例子的设计。它们都是做为JPanel的衍生物来构建的,因此这个措施将安顿前面的每个例子到它本身在JTabbedPane的窗格中。我们会看到操作RTTI制造的措施十分的小巧精美:
//: Tabbed.java // Using tabbed panes package c13.swing; import java.awt.*; import javax.swing.*; import javax.swing.border.*; public class Tabbed extends JPanel { static Object[][] q = { { "Felix", Borders.class }, { "The Professor", Buttons.class }, { "Rock Bottom", ButtonGroups.class }, { "Theodore", Faces.class }, { "Simon", Menus.class }, { "Alvin", Popup.class }, { "Tom", ListCombo.class }, { "Jerry", Progress.class }, { "Bugs", Trees.class }, { "Daffy", Table.class }, }; static JPanel makePanel(Class c) { String title = c.getName(); title = title.substring( title.lastIndexOf('.') + 1); JPanel sp = null; try { sp = (JPanel)c.newInstance(); } catch(Exception e) { System.out.println(e); } sp.setBorder(new TitledBorder(title)); return sp; } public Tabbed() { setLayout(new BorderLayout()); JTabbedPane tabbed = new JTabbedPane(); for(int i = 0; i < q.length; i++) tabbed.addTab((String)q[i][0], makePanel((Class)q[i][1])); add(tabbed, BorderLayout.CENTER); tabbed.setSelectedIndex(q.length/2); } public static void main(String args[]) { Show.inFrame(new Tabbed(),460,350); } } ///:~
再者,我们可以留意到利用的数组结构式样:第一个元素是被置放在卡片上的String,第二个元素是将被显示在对应窗格上JPanel类。在Tabbed()构建器里,我们可以看到两个重要的JTabbedPane要领被利用:addTab()插入一个新的窗格,setSelectedIndex()选择一个窗格并从它开始。(一个在中间被选中的窗格证明我们不必从第一个窗格开始)。
当我们挪用addTab()要领时,我们为它提供卡片的String和一些组件(也就是说,一个AWT组件,而不是一个来自AWT的JComponent)。这个组件会被显示在窗格中。一旦我们这样做了,自然而然的就不需要更多打点了——JTabbedPane会为我们处理惩罚其它的任何事。
makePanel()要领获取我们想建设的类Class工具和用newInstance()去建设并造型为JPanel(虽然,假定那些类是必需从JPanel担任才气增加的类,除非在这一节中为措施例子的布局所利用)。它增加了一个包罗类名并返回功效的TitledBorder,以作为一个JPanel在addTab()被利用。
当我们运行措施时,我们会发明假如卡片太多,填满了一行,JTabbedPane自动地将它们会萃起来。