第11章 Swing组件简介
Swing组件简介
1.模型-视图-控制器设计模式
Swing组件都有三个要素:
●内容,例如,按钮的状态(是否按下)或者文本框中的文本。
●外观显示(颜色,尺寸)。
●行为(对事件的反应)。
也就是MVC模式:实现此模式的三个独立的类:
◆模型-------存储内容
◆视图-------显示内容
◆控制器----处理用户输入
这个模式明确规定了三个对象如何进行交互。模型存储内容,它没有任何用户界面。对于一个按钮来说,内容非常简单—它只是一组标志,用来说明按钮是否按下,是否启用等等。对于一个文本框来说,内容稍稍复杂,它是容纳当前文本的一个字符串对象。这个内容和视图的内容并不一致------如果内容的长度大于文本框的显示长度,那么用户看到的就只有文本框显示的那一部分。模型必须实现改变和发现内容的方法。例如:一个文本模型中的方法有:在当前文本中添加或者删除字符以及把当前文本作为一个字符串返回等。再次强调,模型是完全不可见的,显示存储在模型中的数据是视图的工作。
2.选择组件
●复选框(JCheckBox)
例如:JCheckBoxTest.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class JCheckBoxTest
{
public static void main(String[] args)
{
JCheckBoxFrame f=new JCheckBoxFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.show();
}
}
class JCheckBoxFrame extends JFrame
{
private JLabel label;
private JCheckBox bold;
private JCheckBox italic;
public static final int FONTSIZE=30;
public JCheckBoxFrame()
{
setTitle("JCheckBoxFrame");
setSize(400,300);
Container contentPane=getContentPane();
label=new JLabel("The dog jumps over the pig");
label.setFont(new Font("Serif",Font.PLAIN,FONTSIZE));
contentPane.add(label,BorderLayout.CENTER);
ActionListener listener=new
ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int mode=0;
if(bold.isSelected()) mode +=Font.BOLD;
if(italic.isSelected()) mode +=Font.ITALIC;
label.setFont(new Font("Serif",mode,FONTSIZE));
}
};
JPanel buttonPanel=new JPanel();
bold=new JCheckBox("Bold");
bold.addActionListener(listener);
buttonPanel.add(bold);
italic =new JCheckBox("Italic");
italic.addActionListener(listener);
buttonPanel.add(italic);
contentPane.add(buttonPanel,BorderLayout.SOUTH);
}
};
单选按钮
对于复选框来说,用户可以选折0个或多个。在许多情况下,我们需要用户只选择几个框中的一个。当用户选择另外一个时,前一个选择就自动取消。这样的一组框通常称作一个单选按钮组(radio button group),这是因为这些按钮的工作方式像收音机上的电台选择按钮,当按下一个按钮时,前一个按下的按钮则自动释放。
例如:JRadioButtonTest.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class JRadioButtonTest
{
public static void main(String[] args)
{
JRadioButtonFrame f=new JRadioButtonFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.show();
}
}
class JRadioButtonFrame extends JFrame
{
private JPanel buttonPanel;
private ButtonGroup group;
private JLabel label;
public static final int DEFAULT_SIZE=30;
public JRadioButtonFrame()
{
setTitle("JRadioButtonFrame");
setSize(400,300);
Container contentPane=getContentPane();
label=new JLabel("The lazy dog doesn't jump over the clever pig");
label.setFont(new Font("Serif",Font.PLAIN,DEFAULT_SIZE));
contentPane.add(label,BorderLayout.CENTER);
buttonPanel=new JPanel();
group=new ButtonGroup();
addRadioButton("Small",12);
addRadioButton("Medium",18);
addRadioButton("Large",25);
addRadioButton("Extra large",36);
contentPane.add(buttonPanel,BorderLayout.SOUTH);
}
public void addRadioButton(String name,final int size)
{
boolean selected=size==DEFAULT_SIZE;
JRadioButton button=new JRadioButton(name,selected);
group.add(button);
buttonPanel.add(button);
ActionListener listener=new
ActionListener()
{
public void actionPerformed(ActionEvent e)
{
label.setFont(new Font("Serif",Font.PLAIN,size));
}
};
button.addActionListener(listener);
}
}
边界
如果在一个窗口中有多组单选按钮,那么你需要从视觉上说明哪些按钮属于同一组。Swing提供了一组有用的边界来解决该问题。你可以为任何扩展了JComponent的组件提供一种边界。最常见的用法是在一个面板周围设置一种边界,然后用其他用户界面元素(如单选按钮)来填充该面板。
有几种不同边界可供选择,但是使用它们的步骤完全一样:
◆低斜面
◆凸斜面
◆蚀刻
◆直线
◆不光滑
◆空(只是在组件周围创建一些空白地方)
例如:BorderTest.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class BorderTest
{
public static void main(String[] args)
{
BorderFrame f=new BorderFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.show();
}
};
class BorderFrame extends JFrame
{
private JPanel demoPanel;
private JPanel buttonPanel;
private ButtonGroup group;
public BorderFrame()
{
setTitle("BorderTest");
setSize(400,300);
demoPanel=new JPanel();
buttonPanel=new JPanel();
group=new ButtonGroup();
addRadioButton("Lowered bevel",BorderFactory.createLoweredBevelBorder());
addRadioButton("Raised bevel",BorderFactory.createRaisedBevelBorder());
addRadioButton("Etched",BorderFactory.createEtchedBorder());
addRadioButton("Line",BorderFactory.createLineBorder(Color.blue));
addRadioButton("Matte",BorderFactory.createMatteBorder(10,10,10,10,Color.blue));
addRadioButton("Empty",BorderFactory.createEmptyBorder());
Border etched=BorderFactory.createEtchedBorder();
Border titled=BorderFactory.createTitledBorder(etched,"Border types");
buttonPanel.setBorder(titled);
Container contentPane=getContentPane();
contentPane.setLayout(new GridLayout(2,1));
contentPane.add(buttonPanel);
contentPane.add(demoPanel);
}
public void addRadioButton(String buttonName,final Border b)
{
JRadioButton button=new JRadioButton(buttonName);
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
demoPanel.setBorder(b);
validate();
}
});
group.add(button);
buttonPanel.add(button);
}
};
组合框
如果你有很多的选择项,那么使用单选按钮就不合适了,这是因为它们会占用很大的屏幕空间。取而代之的是,你可以使用一个组合框。当用户点击该组件时,一列选择项就会下拉弹出,然后用户可以选择其中的一个。如果该下拉列表框被设置成可编辑的,那么你可以编辑当前选择项,这时候该组件才称作组合框----它把编辑框的灵活性与一组预定义的选择项组合起来。JComboBox类提供了组合框组件。
例如:JComboBoxTest.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JComboBoxTest
{
public static void main(String[] args)
{
JComboBoxFrame f=new JComboBoxFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.show();
}
};
class JComboBoxFrame extends JFrame
{
private JComboBox faceCombo;
private JLabel label;
public static final int DEFAULT_SIZE=30;
public JComboBoxFrame()
{
setTitle("JComboBoxFrame");
setSize(400,300);
Container contentPane=getContentPane();
label=new JLabel("The dog jumps over the monkey");
label.setFont(new Font("Serif",Font.PLAIN,DEFAULT_SIZE));
contentPane.add(label,BorderLayout.CENTER);
faceCombo=new JComboBox();
faceCombo.setEditable(true);
faceCombo.addItem("Serif");
faceCombo.addItem("SansSerif");
faceCombo.addItem("Monospaced");
faceCombo.addItem("Dialog");
faceCombo.addItem("DialogInput");
faceCombo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
label.setFont(new
Font((String)faceCombo.getSelectedItem(),Font.PLAIN,DEFAULT_SIZE));
}
});
JPanel comboPanel =new JPanel();
comboPanel.add(faceCombo);
contentPane.add(comboPanel,BorderLayout.SOUTH);
}
};
滑块
组合框允许用户从一组离散值中进行选择。而滑块允许进行连续值的选择,例如,选择从1到100的任意值。构造一个滑块的方法如下:
JSlider slider=new JSlider(min,max,initialValue);
如果你忽略最小值,最大值和初始值,那么这三项分别默认为0,100,50。或者,如果你需要一个垂直的滑块,那么可以使用如下构造器:
JSlider slider=new JSlider(SwingConstants.VERTICAL,min,max,initialValue);
下面是使用滑块的综合例子。
例如:JSliderTest.java
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
public class JSliderTest
{
public static void main(String[] args)
{
JSliderTestFrame f=new JSliderTestFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.show();
}
};
class JSliderTestFrame extends JFrame
{
private JPanel sliderPanel;
private JTextField textField;
private ChangeListener listener;
public JSliderTestFrame()
{
setTitle("JSliderTest");
setSize(400,500);
sliderPanel=new JPanel();
sliderPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
listener=new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
JSlider source=(JSlider)e.getSource();
textField.setText(""+source.getValue());
}
};
// add a plain slider
JSlider slider=new JSlider();
addSlider(slider,"Plain");
//add a slider with major and minor ticks
slider=new JSlider();
slider.setPaintTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider,"Ticks");
//add a slider that snaps to ticks
slider=new JSlider();
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider,"Snap to ticks");
//add a filled slider
slider =new JSlider();
slider.setPaintTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
slider.putClientProperty("JSlider.isFilled",Boolean.TRUE); addSlider(slider,"Filled");
// add a filled and inverted slider
slider=new JSlider();
slider.setPaintTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
slider.putClientProperty("JSlider.isFilled",Boolean.TRUE); slider.setInverted(true);
addSlider(slider,"Inverted");
//add a slider with numeric labels
slider=new JSlider();
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider,"Labels");
//add a slider with alphabetic labels
slider=new JSlider();
slider.setPaintLabels(true);
slider.setPaintTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
Hashtable labelTable=new Hashtable();
labelTable.put(new Integer(0),new JLabel("A"));
labelTable.put(new Integer(20),new JLabel("B"));
labelTable.put(new Integer(40),new JLabel("C"));
labelTable.put(new Integer(60),new JLabel("D"));
labelTable.put(new Integer(80),new JLabel("E"));
labelTable.put(new Integer(100),new JLabel("F"));
slider.setLabelTable(labelTable);
addSlider(slider,"Custom labels");
//add a slider with icon labels
slider=new JSlider();
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setSnapToTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(20);
labelTable = new Hashtable();
//add card images
labelTable.put(new Integer(0),new JLabel(new ImageIcon("01.gif")));
labelTable.put(new Integer(20),new JLabel(new ImageIcon("02.gif")));
labelTable.put(new Integer(40),new JLabel(new ImageIcon("03.gif")));
labelTable.put(new Integer(60),new JLabel(new ImageIcon("04.gif")));
labelTable.put(new Integer(80),new JLabel(new ImageIcon("05.gif")));
labelTable.put(new Integer(100),new JLabel(new ImageIcon("06.gif")));
slider.setLabelTable(labelTable);
addSlider(slider,"Icon labels");
//add the text field that displays the slider value
textField=new JTextField();
Container contentPane=getContentPane();
contentPane.add(sliderPanel,BorderLayout.CENTER);
contentPane.add(textField,BorderLayout.SOUTH);
}
public void addSlider(JSlider s,String description)
{
s.addChangeListener(listener);
JPanel panel=new JPanel();
panel.add(s);
panel.add(new JLabel(description));
sliderPanel.add(panel);
}
};
微调控制器(JSpinner)
JSpinner(微调控制器)也是文本框,它在一边带有两个小按钮,可以让你增加或者减少存储在文本框内的值。
例如:JSpinnerTest.java
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
public class JSpinnerTest
{
public static void main(String[] args)
{
JSpinnerFrame f=new JSpinnerFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.show();
}
};
class JSpinnerFrame extends JFrame
{
private JPanel mainPanel;
private JButton okButton;
public JSpinnerFrame()
{
setTitle("SpinnerTest");
setSize(400,300);
Container contentPane=getContentPane();
JPanel buttonPanel=new JPanel();
okButton=new JButton("Ok");
buttonPanel.add(okButton);
contentPane.add(buttonPanel,BorderLayout.SOUTH);
mainPanel=new JPanel();
mainPanel.setLayout(new GridLayout(0,3));
contentPane.add(mainPanel,BorderLayout.CENTER);
JSpinner defaultSpinner=new JSpinner();
addRow("Default",defaultSpinner);
JSpinner boundedSpinner=new JSpinner(new SpinnerNumberModel(5,0,10,0.5));
addRow("Bounded",boundedSpinner);
String[] fonts=GraphicsEnvironment.getLocalGraphicsEnvironment()
.getAvailableFontFamilyNames();
JSpinner listSpinner=new JSpinner(new SpinnerListModel(fonts));
addRow("List",listSpinner);
JSpinner reverseListSpinner=new JSpinner(new SpinnerListModel(fonts)
{
public Object getNextValue()
{
return super.getPreviousValue();
}
public Object getPreviousValue()
{
return super.getNextValue();
}
});
addRow("Reverse List",reverseListSpinner);
JSpinner dateSpinner=new JSpinner(new SpinnerDateModel());
addRow("Date",dateSpinner);
JSpinner betterDateSpinner =new JSpinner(new SpinnerDateModel());
String pattern=((SimpleDateFormat)DateFormat.getDateInstance()).toPattern();
betterDateSpinner.setEditor(new JSpinner.DateEditor(betterDateSpinner,pattern));
addRow("Better Date",betterDateSpinner);
JSpinner timeSpinner =new JSpinner(new SpinnerDateModel(new
GregorianCalendar(2000,Calendar.JANUARY,1,12,0,0).getTime(),null,null,Calendar.HOUR));
addRow("Time",timeSpinner);
JSpinner permSpinner=new JSpinner(new PermutationSpinnerModel("meat"));
addRow("Word permutations",permSpinner);
}
public void addRow(String labelText,final JSpinner spinner)
{
mainPanel.add(new JLabel(labelText));
mainPanel.add(spinner);
final JLabel valueLabel=new JLabel();
mainPanel.add(valueLabel);
okButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Object value=spinner.getValue();
valueLabel.setText(value.toString());
}
});
}
};
class PermutationSpinnerModel extends AbstractSpinnerModel {
private String word;
public PermutationSpinnerModel(String w)
{
word=w;
}
public Object getValue()
{
return word;
}
public void setValue(Object value)
{
if(!(value instanceof String))
throw new IllegalArgumentException();
word=(String)value;
fireStateChanged();
}
public Object getNextValue()
{
StringBuffer buffer=new StringBuffer(word);
for(int i=buffer.length()-1;i>0;i--)
{
if(buffer.charAt(i-1) { int j=buffer.length()-1; while(buffer.charAt(i-1)>buffer.charAt(j)) j--; swap(buffer,i-1,j); reverse(buffer,i,buffer.length()-1); return buffer.toString(); } } reverse(buffer,0,buffer.length()-1); return buffer.toString(); } public Object getPreviousValue() { StringBuffer buffer=new StringBuffer(word); for(int i=buffer.length()-1;i>0;i--) { if(buffer.charAt(i-1)>buffer.charAt(i)) { int j=buffer.length()-1; while(buffer.charAt(i-1) swap(buffer,i-1,j); reverse(buffer,i,buffer.length()-1); return buffer.toString(); } } reverse(buffer,0,buffer.length()-1); return buffer.toString(); } private static void swap(StringBuffer buffer,int i,int j) { char temp=buffer.charAt(i); buffer.setCharAt(i,buffer.charAt(j)); buffer.setCharAt(j,temp); } private static void reverse(StringBuffer buffer,int i,int j) { while(i } }; 文件对话框 当你编写一个应用程序时,你常常需要打开和保存文件。一个好的文件对话框是很难编写的,它应该能够显示文件和目录并且让用户浏览文件系统。你肯定不会想去发明这种对话框。 幸运的是,Swing提供一个JFileChooser类可以用来显示一个文件对话框; 例如:JFileChooserTest.java import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.beans.*; import java.util.*; import java.io.*; import javax.swing.*; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileView; public class JFileChooserTest { public static void main(String[] args) { ImageViewerFrame f=new ImageViewerFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.show(); } } class ImageViewerFrame extends JFrame { private JLabel label; private JFileChooser chooser; public ImageViewerFrame() { setTitle("JFileChooserTest"); setSize(500,400); JMenuBar menuBar=new JMenuBar(); setJMenuBar(menuBar); JMenu menu=new JMenu("File"); menuBar.add(menu); JMenuItem openItem=new JMenuItem("Open"); menu.add(openItem); openItem.addActionListener(new FileOpenListener()); JMenuItem exitItem=new JMenuItem("Exit"); menu.add(exitItem); exitItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.exit(0); } }); label=new JLabel(); Container c=getContentPane(); c.add(label); chooser=new JFileChooser(); final ExtensionFileFilter filter =new ExtensionFileFilter(); filter.addExtension("jpg"); filter.addExtension("jpeg"); filter.addExtension("gif"); filter.setDescription("Image files"); chooser.setFileFilter(filter); chooser.setAccessory(new ImagePreviewer(chooser)); chooser.setFileView(new FileIconView(filter,new ImageIcon("02.gif"))); } private class FileOpenListener implements ActionListener { public void actionPerformed(ActionEvent e) { chooser.setCurrentDirectory(new File(".")); final ExtensionFileFilter filter =new ExtensionFileFilter(); filter.addExtension("jpg"); filter.addExtension("jpeg"); filter.addExtension("gif"); filter.setDescription("Image files"); chooser.setFileFilter(filter); int result=chooser.showOpenDialog(ImageViewerFrame.this); if(result==JFileChooser.APPROVE_OPTION) { String name=chooser.getSelectedFile().getPath(); label.setIcon(new ImageIcon(name)); } } }; }; class ExtensionFileFilter extends FileFilter { private String description=""; private ArrayList extensions=new ArrayList(); public void addExtension(String extension) { if(!extension.startsWith(".")) extension="."+extension; extensions.add(extension.toLowerCase()); } public void setDescription(String description) { this.description=description; } public String getDescription() { return description; } public boolean accept(File f) { if(f.isDirectory()) return false; String name=f.getName().toLowerCase(); for(int i=0;i if(name.endsWith((String)extensions.get(i))) return true; return false; } }; class FileIconView extends FileView { private FileFilter filter; private Icon icon; public FileIconView(FileFilter filter,Icon icon) { this.filter=filter; this.icon=icon; } public Icon getIcon(File f) { if(!f.isDirectory()&&filter.accept(f)) return icon; else return null; } }; class ImagePreviewer extends JLabel { public ImagePreviewer(JFileChooser chooser) { setPreferredSize(new Dimension(100,100)); setBorder(BorderFactory.createEtchedBorder()); chooser.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { if(e.getPropertyName()==JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) { File f=(File)(e.getNewValue()); if(f.isFile()) { ImageIcon icon=new ImageIcon(f.getPath()); if(icon.getIconWidth()>getWidth()) icon=new ImageIcon(icon.getImage().getScaledInstance(getWidth(),-1,Image.SCALE_DEFAULT)); setIcon(icon); } } } }); } }; 颜色选择器 上个例子你已经看到,高质量的文件选择器是一个很复杂的用户界面组件,你可能不愿意自己实现。 除了文件选择器之外,Swing只提供了另外一种选择器-----JColorChooser。 你可以使用它来挑选一种颜色。同JFileChooser类一样,颜色选择器是一个组件而非一个对话框。 但是它包含了用于创建包含一个颜色选择器组件的对话框的方法。 例如:JColorChooserTest.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class JColorChooserTest { public static void main(String[] args) { JColorChooserFrame f=new JColorChooserFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.show(); } }; class JColorChooserFrame extends JFrame { public JColorChooserFrame() { setTitle("JColorChooserTest"); setSize(400,300); ColorChooserPanel panel=new ColorChooserPanel(); Container contentPane=getContentPane(); contentPane.add(panel); } }; class ColorChooserPanel extends JPanel { public ColorChooserPanel() { JButton modalButton=new JButton("Modal"); modalButton.addActionListener(new ModalListener()); add(modalButton); JButton modelessButton=new JButton("Modeless"); modelessButton.addActionListener(new ModelessListener()); add(modelessButton); JButton immediateButton=new JButton("Immediate"); immediateButton.addActionListener(new ImmediateListener()); add(immediateButton); } private class ModalListener implements ActionListener { public void actionPerformed(ActionEvent e) { Color defaultColor=getBackground(); Color selected=JColorChooser.showDialog(ColorChooserPanel.this,"Set background",defaultColor); setBackground(selected); } }; private class ModelessListener implements ActionListener { private JDialog dialog; private JColorChooser chooser; public ModelessListener() { chooser=new JColorChooser(); dialog=JColorChooser.createDialog(ColorChooserPanel.this,"Background Color",false,chooser,new ActionListener() { public void actionPerformed(ActionEvent e) { setBackground(chooser.getColor()); } },null); } public void actionPerformed(ActionEvent e) { chooser.setColor(getBackground()); dialog.show(); } } private class ImmediateListener implements ActionListener { private JDialog dialog; private JColorChooser chooser; public ImmediateListener() { chooser=new JColorChooser(); chooser.getSelectionModel().addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e){ setBackground(chooser.getColor()); } }); dialog=new JDialog((Frame)null,false/*not moal */); dialog.getContentPane().add(chooser); dialog.pack(); } public void actionPerformed(ActionEvent e) { chooser.setColor(getBackground()); dialog.show(); } }; }; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.tree.*; import javax.swing.event.*; import javax.swing.border.*; import javax.swing.table.*; /** * Swing 组件测试程序 * 测试Swing所有组件及其相应的事件 * @author 天翼.李 2003.4.17 晚23:14 * @link https://www.360docs.net/doc/d24172773.html, * @link robococde@https://www.360docs.net/doc/d24172773.html, */ public class SwingT est extends JFrame { /** * 主模块,初始化所有子模块,并设置主框架的相关属性 */ public SwingTest() { // 初始化所有模块 MenuTest menuTest = new MenuTest(); LeftPanel leftPanel = new LeftPanel(); RightPanel rightPanel = new RightPanel(); BottomPanel bottomPanel = new BottomPanel(); CenterPanel centerPanel = new CenterPanel(); // 设置主框架的布局 Container c = this.getContentPane(); // c.setLayout(new BorderLayout()) this.setJMenuBar(menuTest); c.add(leftPanel,BorderLayout.WEST); c.add(rightPanel,BorderLayout.EAST); c.add(centerPanel,BorderLayout.CENTER); c.add(bottomPanel,BorderLayout.SOUTH); // 利用无名内隐类,增加窗口事件 this.addWindowListener(new WindowAdapter() { public void WindowClosing(WindowEvent e) 需要注意的是,取得文本框中的文本时,使用方法getText(),该方法返回的是一个String类型的对象;而要取得密码框中的文本,使用方法getPassword(),该方法返回的是一个char数组。 例如,创建了一个密码框: JPasswordField txtPwd=new JPasswrodField(20); 设定该密码框的回显字符为'#': txtPwd.setEchoChar('#'); 取得密码框中的内容: char []pwd=txtPwd.getPassword(); 也可以方便地将char数组转化为String类型的对象: String pwdStr=new String(txtP.getPassword()); 3.菜单 (1)菜单也是一种常用的GUI组件,菜单采用的是一种层次结构,最顶层是菜单栏(JMenuBar);在菜单栏中可以添加若干个菜单(JMenu),每个菜单中又可以添加若干个菜单选项(JMenuItem)、分隔线(Separator)或是菜单(称之为子菜单)。 (2)构建应用程序的菜单时,先创建一个菜单栏: JMemuBar menuBar=new JMenuBar(); 通常使用框架的setJMenuBar(JMenuBar aMenuBar)方法将菜单栏置于框架中:frame.setJMenuBar(menuBar); 随后,创建所需要的各菜单并逐个添加到菜单栏中,例如: JMenu menuDBAccount=new JMenu("电表出帐(C)"); ... JMenu menuSysConfig=new JMenu("系统设置(X)"); menuBar.add(menuDBAccount); ... menuBar.add(menuSysConfig); 最后,向各个菜单中添加菜单选项、分隔线或是子菜单,如图所示的系统设置菜单为例: //创建菜单选项或是子菜单 JMenuItem sysConfigItem=new JMenuItem("参数设置(S)..."); JMenu viewMenu=new JMenu("外观设置"); JRadioButtonMenuItem metalItem=new JRadioButtonMenuItem("金属外观"); JRadioButtonMenuItem classicItem=new JRadioButtonMenuItem("传统外观"); JRadioButtonMenuItem modernItem=new JRadioButtonMenuItem("现代外观"); JMenuItem cascadeItem=new JMenuItem("层叠窗口(C)"); JMenuItem iconifyItem=new JMenuItem("排列图标(I)"); //将三个单选按钮添加到一个按钮组 ButtonGroup group=new ButtonGroup(); group.add(metalItem); group.add(classicItem); group.add(modernItem); //构建子菜单 viewMenu.add(metalItem); (总结)Swing组件的使用 Swing 的组件与AWT 组件相似,但又为每一个组件增添了新的方法,并提供了更多的高级组件.Swing 的基本组件:1.按钮(JButton): Swing 中的按钮可以显示图像,并且可以将按钮设置为窗口的默认图标,而且还可以将多个图像指定给一个按钮。 (1).JButton 常用的构造方法。 JButton(String text):按钮上显示字符。 JButton(Icon icon) :按钮上显示图标。 JButton(String text, Icon icon):按钮上既显示图标又显示字符。 (2).常用方法: b1.setEnabled(false); //使按钮当前不可用 b1.setToolTipText("..."): //设置按钮提示文本 b1.setMnemonic(KeyEvent.VK_D);// 将b1邦定alt+D键(3).案例代码: [java] view plain copy print?public class JButtonExample3 extends JPanel implements ActionListener { protected JButton b1, b2, b3; public JButtonExample3() { ImageIcon leftButtonIcon = createImageIcon("right.gif"); ImageIcon middleButtonIcon = createImageIcon("middle.gif"); ImageIcon rightButtonIcon = createImageIcon("left.gif"); b1 = new JButton("失效中间按钮(D)", leftButtonIcon); b1.setVerticalTextPosition(AbstractButton.CENTER);// 水平中间对齐 b1.setHorizontalTextPosition(AbstractButton.LEADING);// 相当于LEFT b1.setMnemonic(KeyEvent.VK_D);// 将b1邦定alt+D键b1.setActionCommand("disable"); b2 = new JButton("M中间按钮", middleButtonIcon); b2.setVerticalTextPosition(AbstractButton.BOTTOM); b2.setHorizontalTextPosition(AbstractButton.CENTER); b2.setMnemonic(KeyEvent.VK_M);// 将b2邦定alt+M键b3 = new JButton("E激活中间按钮", rightButtonIcon); b3.setMnemonic(KeyEvent.VK_E);// 将b3邦定alt+E键 b3.setActionCommand("enable"); b3.setEnabled(false); // 给1和3添加事件监听b1.addActionListener(this); b3.addActionListener(this); // 设置按钮提示文本b1.setToolTipText("点击这个按钮, 主要参考文现: [美]Herbert Schildt 著 鄢爱兰 鹿江春译 《java 参考大全 J2SE 》 清华大学出版社 2006年1月 孙卫琴 《Java 面向对象编程》 出版社及日期不详 java API 开发人员文档 本文作者:黄邦勇帅 本文的说明:本文主要讲解了对大学初学Swing 时对根面板JRootPane ,内容面板containPane ,层面板JLayeredPane ,玻璃面板glassPnae 的困惑,本文对各种面板作了详尽的讨论,让读者能真正的明白根面板,内容面板,层面板到底是什么,他们在程序中的作用,以及他们之间的关系,透明性,可见性,作了讲解。本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。 Swing 组件的各种面板(JRootPane 根面板,JLayeredPane 层面板等) 第一部分:JFrame 中各面板间的关系,透明性与可见性问题 注:在某些地方把面板也叫做窗格,比如根面板,也叫根窗格,层面板也叫分层窗格等。注意窗格与窗体是不一样的。 在Swing 中的JFrame 窗体与AWT 中的Frame 窗体有一些不同。JFrame 由他的窗体本身加上其上的JRootPane 根面板,JLayeredPane 层面板,containPane 内容面板,glassPane 玻璃面板,JMenuBar 菜单栏(可选,不包括在内)四部分组成。其中根面板在JRootPane 类中实现,层面板在JLayeredPane 类中实现,他们都是JComponent 的子类。而containPane 和glassPane 没有专门对应的类。 1、各种面板(或称窗格)的关系及作用: JRootPane 根面板:该面板是在JFrame 窗体创建时就默认添加进来的,是所有其他面板的载体或父级,他覆盖窗体的除标题栏和边条之外的整个表面。根面板默认是不可见的。根面板负责管理其他面板(层面板,玻璃面板),如使其他面板覆盖整个JFrame 窗体等。 JLayeredPane 层面板:该面板是其他所有面板的父级,在JRootPane 面板的上面,他再次覆盖窗体的整个表面,内容面板和JMenuBar 菜单栏被添加到层面板上。当添加了菜单栏时,菜单栏被添加到JLayeredPane 面板的顶部,剩下的部分被内容面板填充。层面板是分很多层的,每一层使用一个相应的数字来表示,而内容面板就位于层面板中的某一层,在后面的内容中我们可以看到层面板可以让你设计出相互重叠的内部窗体,层面板将负责管理各种内部窗体的叠放问题,对于层面板的每一层都相当于是一个容器,因此可以直接向层面板中添加组件。层面板的内容后面会作具体介绍。 containPane 内容面板:由层面板的介绍可知,内容面板是层面板中的某一层。默认的内容面板是不透明的,而且是一个JPane 对象。该面板在窗体中起着工作区的作用,当我们向窗体添加组件时就应该添加到这一层上,而不能像AWT 那样直接添加到窗体上,若你那样做了,实际上该组件也是被添加到内容面板上的,若窗体未设置内容面板,则组件无法显示。比如要添加按钮jb 则正确的方式为,Container p=jframe.getContentPane(); p.add(jr); 或jframe.getContentPane().add(jr); 其中getContentPane()是JFrame 类中的方法,该方法将反回内容面板的引用,这是访问默认的内容面板的方法,因为默认的内容面板没有特定的名字,因此应使用该方法。 glassPane 玻璃面板:该面板总是存在的,而且他位于最上面,默认情况下玻璃面板是不可见的,玻璃面板用于接收鼠标事件和在其他组件上绘图。 2、各面板中使用的布局管理器: 在内容面板上使用的布局管理器默认是BorderLayout 。 在根面板上使用的布局管理器是一个自定义的LayoutManager(布局管理器),他的作用是布局根面板之上的其他面板。很明显如果你要向根面板中添加组件就应使用setLayout 方法为其设置合适的布局管理器或自已设定组件的大小和显示 一抛砖引玉 本文指在利用一个小程序”Swing 组件大全”来引导大家学习Java这门语言,熟悉Ja va Swing的各个组件。并在学习过程中参考作者设计这一程序的方法和思想,最终形成自己的思维方式和学习方式。你能举一返三是作者最开心的事情。小程序演示了Java Swing 大部分组件。最后附上了全部代码及详细的注释说明。希望本文能对大家学习Java有所帮助。 随着Java风潮席卷国内,学习Java的方法和路径越来越多。而在大量的书本前,在J ava庞大的类库前大大家都有点迷失方向的感觉,是学J2EE,J2ME还是。。。。。。然而所有的这些都或多或少的离不开J2SE。万丈高楼平地起。J2SE是整个Java的基础,学好了这个对Java的各个方向都是很有利的。而学习J2SE的最初点就在界面设计,因为界面编程是你来感觉最直接的手段,是提高大家编程兴趣的很好开始,因为你写完程序编译后可马上看到自己的成果。而不像后台编程做完了都感受不到效果。而好的界面也是你测试你其他程序的基础。 界面设计!不就是拖拉操作吗?如果是VB,VC等可视化的编程,的确只是一些拖拉操作,由于Java语言的设计中所有的东西都是程序代码,在Java中如果想要设计一个好的界面,可不是简单的拖拉操作能完成的。即使使用了如JBuilder这么强大的可视化工具,你也得亲自动手写一些界面设计代码才能很好的完成你的任务。如果你能在此基础上理解Java界面设计的思想,对你学习这门语言将有莫大的帮助。 Java界面设计主要涉及Awt,Swing两大类库,Swing是Awt的扩展和功能加强。下面我们就以Swing为基础来说说整个Java的界面设计。 二感受效果 在开始之前,让我们看看这篇文章要达到的效果,有了目标和成果才有学习的兴趣,起码我是这样认为和学习的。如下图所示,这就是我们设计的界面,它包括了Swing中大部分 JFrame是主窗口,它和JDialog,JApplet的地位并列。但是,一个JFrame可以添加JDialog和JApplet进去它的内容面板,而反过来就不行。 2、JLabel JLabel是一标签,在它的文本里嵌入html标签,可以简单实现一个超链接组件 3、JTextField 一个文本框 4、JTextArea 文本区域,与文本框不同的是它是多行的 5、JPasswordField 6、JPanel 一个面板.一般用作控制组件的布局. 7、JCheckBox 复选框 8、JRadioButton 单选按钮.单选按钮要用到ButtonGroup.添加到同一个ButtonGroup的单选按钮表示在它们之间只可选其一.不同ButtonGroup里的单选按钮相互之间的选择不受影响. 9、JScrollPane JScrollPane由四个角,两个头部,和一个视口组成.四个角和两个头部都是由Component组成.四个角并不是总是显示出来的.左上角只有当两个头部同时存在才显示,右下角只有两个滚动条同时出现才会出现.其他两个角可同理知道什么时候会出现.视口是显示内容的部分,由JViewport对象表示.而真正显示的内容,由JV iewport的view表示 10、JList JList是一个列表.这里将首次引入Model这个概念,中文翻译是模型,不好理解,其实就是数据的意思.JList用ListModel保存它的数据.简单应用可以用实现了ListModel的AbstraceListModel的子类DefaultListModel来保存它的数据(尽管它的名字有Default,但是只有你使用了它创建JList,它才存在.即如果你没有用DefaultListModel创建JList,则你用getModel()返回的ListModel不能强制转换为DefaultListModel). 11、JComboBox 组合框和JList很相似,它们都是用ListModel来保存数据.默认它是使用实现了ListModel的子接口ComboBoxModel的DefaultComboBoxModel来保存数据的.与JList的情况不同,一个JComboBox总是有一个Model来保存数据的,而JList则不然. 12、JFileChooser JFileChooser代表一个打开/保存文件对话框 13、JColorChooser 一个颜色选择器.它的构造方法有: JColorChooser(),JColorChooser(Color initialColor),JColorChooser(ColorSelectionModel model) 创建了对象以后,可以调用将它添加到JFrame,JPanel等其他容器里面. 14、JSlider JSlider是一个滑动条.其实它还是比较容易使用的 15、JLayeredPane JFrame,JApplet,JDialog,JInternalFrame其实是由好几部分组成的 16、JInternalFrame JFrame不能添加JFrame到自已的内容面板.那么,如何实现多文档程序呢?用JInternalFrame swing 组价和容器——java swing 组件和技术(中) 一、swing组件和容器概览 1.顶层容器(JFrame,JDialog,JApplet) JFrame—框架,主要用来设计应用程序的图像界面 JDialog—对话框,通常用来设计具有依赖关系的窗口 JApplet—小应用程序,主要用来设计嵌入网页中运行的java程序2.一般容器 普通容器(JPanel、JScrollPane、JToolbar、JSplitPane、JTabbedPane) JPanel—面板,通常只有背景颜色的普通容器 JScrollPane—滚动窗格,具有滚动条 JToolbar—工具条,通常将多个组件排成一排或者一列 JSplitPane—分裂窗格,用来装两个组件的容器 JTabbedPane—选项卡窗格,允许多个组件共享相同的界面空间 专用容器(JLayeredPane、JRootPane 、JInternalFrame) JLayeredPane—分层窗格,给窗格增加了深度的概念 JRootPane—根窗格,一般是自动创建的容器 JInternalFrame—内部窗格,可以在一个窗口内显示若干个类似于框架的窗口 3.基本控件(JButton、JCombobox、JList、JMenu、JSlider、JTextField) 4.不可编辑信息组件(JLabel、JProgressBar、JToolTip等) 5.可编辑组件(JColorChooser、JFileChooser、Jtabel、JTextArea、JTree等) 二、常用的swing组件和容器 1.JFrame ?顶层容器,默认不可见;默认布局方式为BorderLayout ?构造函数: ●JFrame() ●JFrame(String title)//title 为框架的标题内容 ?JFrame常用方法 ●setDefaultCloseOperation(int operation)—设置关闭框架的行为 参数operation一般是JFrame. EXIT_ON_CLOSE,表示关闭框架时, 则退出程序 ●setSize(int width, int height)—设置框架的大小 ●setVisible(boolean b)—设置框架是否可见,默认为false ●getContentPane()—获取顶层容器的内容面板 第8章Swing组件 在第7章中,介绍了用AWT创建图形用户界面的基本原理。在java.awt包中,提供了各种具体的组件,如Frame、Panel、Button、Label等。AWT组件的优点是简单、稳定,同时兼容于任何JDK版本,缺点是依赖于本地操作系统的GUI,缺乏平台的独立性。为了实现跨平台,使得用java创建的图形界面在不同操作系统中保持相同的外观,从JKD1.2版本开始引入了Swing组件,这些组件位于javax.swing包中, Swing GUI组件定义了相对于java.awt 包更多、更强的功能,可以使用户更加灵活方便的进行GUI的设计。 Swing组件时用纯Java语言编写的,不依赖于本地操作系统的GUI,Swing组件可以跨平台运行。独立于本地平台的Swing组件被称为轻量级组件,而依赖于本地平台的AWT组件被称为重量级组件。 多数Swing组件的父类为javax.swing.JComponent,JComponent 的直接父类为java.awt.Container,与AWT中的Window与Panel处于同一个继承类层次。多数Swing组件类都是以大写字母“J”开头,图8-1显示了Swing组件的类层次结构。从图中可以看出,除JFrame外,其余的Swing组件都继承自JComponent类。 图8-1 Swing组件的类层次结构 8.1 容器组件 8.1.1 JFrame JFrame是用来替代AWT包中Frame的,可以实现与Frame相同的功能,包括作为容器容纳其他组件,显示组件等。 [例8-1] import javax.swing.*; import java.awt.*; class JFrameTest extends JFrame{ private JButton button1 = new JButton("button1"); private JButton button2 = new JButton("button2"); public JFrameTest(String title){ super(title);//设置标题 this.setBounds(50,50,200,150); //获得与JFrame关联的contentPane,contentPane默认的布局管理器是BorderLayout Container contentPane = this.getContentPane(); contentPane.setLayout(new FlowLayout(5)); contentPane.add(button1); contentPane.add(button2); this.setVisible(true); //设置JFrame对关闭按钮的处理方式 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } public class Test8_1 { public static void main(String[] args) { new JFrameTest("JFrame测试"); } } 程序运行界面如下: 图8-2 例8-1运行界面 利用JFrame实现了与Frame相同的功能,但JFrame与Frame在使用上还是有很大区别的。 swing布局详解(附示例图) 当选择使用JPanel和顶层容器的content pane时,需要考虑布局管理。JPanel缺省是初始化一个FlowLayout,而content pane缺省是初始化一个BorderLayout。 下面将分别介绍几种最常用的布局管理器:FlowLayout、BorderLayout、BoxLayout、CardLayout、GridLayout和GridBagLayout。 代码演示 每一个布局管理器都会有一个代码演示,xxxLayoutDemo.java(见附件)。这些文件主要有三个方法组成: addComponentsToPane()提供布局逻辑(依据不同的布局管理器和UI内容)。 FlowLayout FlowLayout类是最简单的布局管理器。它按照和页面上排列单词的类似方式来安排组件----从左到右,直至没有多余的空间,然后转到下一行。 效果: 内容面板代码: BorderLayout 一个BorderLayout对象将界面分成五大区域,分别用BorderLayout类的静态常量指定:-PAGE_START -PAGE_END -LINE_START -LINE_END -CENTER 效果: 内容面板代码: BoxLayout BoxLayout可以将组件由上至下或由左至右依次加入当前面板。效果: 内容面板代码: CardLayout 卡片布局和其他布局不同,因为它隐藏了一些组件。卡片布局就是一组容器或者组件,它们一次仅仅显是一个,组中的每个容器称为卡片。 效果: 内容面板代码: GridLayout GridLayout让你建立一个组件表格,并且当组件加入时,会依序又左至右,由上至下填充到每个格子,它不能由你指定想放那个格子就放那个格子 效果: 内容面板代码: GridBagLayout GridBagLayout是所有AWT布局管理器当中最复杂的,同时他的功能也是最强大的。GridBagLayout 同GridLayout一样,在容器中以网格形式来管理组件。但GridBagLayout功能要来得强大得多。 1、GridBagLayout管理的所有行和列都可以是大小不同的; 2、GridLayout把每个组件限制到一个单元格,而GridBagLayout并不这样:组件在容器中可以占据任意大小的矩形区域。 GridBagLayout通常由一个专用类来对他布局行为进行约束,该类叫GridBagConstraints。其中有11个公有成员变量,GridBagConstraints可以从这11个方面来进行控制和操纵。这些内容是: 1、gridx—组件的横向坐标; 2、girdy—组件的纵向坐标; 3、gridwidth—组件的横向宽度,也就是指组件占用的列数; 4、gridheight—组件的纵向长度,也就是指组件占用的行数; import java.awt.*; import javax.swing.*; import java.awt.event.*; class jmenuframe extends JFrame implements ActionListener{ JMenuBar menubar; JMenu m1; JMenu m11; JMenuItem m111; JMenuItem m112; JMenu m2; JMenu m21; JMenu m211; JMenu m212; JMenu m213; JMenuItem num1; JMenuItem name1; JMenuItem num2; JMenuItem name2; JMenuItem num3; JMenuItem name3; public jmenuframe(){ setSize(800,700); setTitle("登陆主界面"); Container c=getContentPane(); c.setBackground(Color.green); Label la=new Label("欢迎你,青青!您已进入主界面,可以进行相关操作了"); la.setBounds(100,300,600,30); la.setFont(new Font("宋体",Font.ITALIC,25)); la.setForeground(Color.blue); add(la); menubar=new JMenuBar(); menubar.setBackground(Color.pink); m1=new JMenu("学生信息管理"); m1.setForeground(Color.red); m1.setFont(new Font("楷体",Font.BOLD,25)); m2=new JMenu("学生成绩管理"); m2.setForeground(Color.magenta); m2.setFont(new Font("楷体",Font.BOLD,25)); m11=new JMenu("学生查询"); 第33章容器,布局管理器,边框 33.1 容器是用来存放而组织组建的对象 布局管理器是用来在容器中摆放组件的特殊对象 33.2 Swing容器的结构 不是直接显示用户界面组件,而是将组建放置到容器中,容器会显示它所包含的组件。所有容器的父类都是java.awt.Container,它是https://www.360docs.net/doc/d24172773.html,ponent的子类。 Container类具有以下功能 1.可以使用各种add和remove方法来添加和删除组件 2.拥有layout属性,用于指定在容器中放置组件的布局管理器,每个容器都有一个默 认的布局管理器 3.提供java.awt.event.ContainerEvent事件的注册方法 Jframe,JApplet,JDialog集成其对应的中性组件的所有功能,但具有较为复杂的内部结构,包含了多层窗格。 javax.swing.JRootPane是一个轻型容器,供Swing顶级容器在后台使用 javax.swing.JLayeredPane是一个用于管理可选菜单栏和内容窗格的容器 内容窗格是Container类的一个实例。默认状态下,他是一个具有布局管理器BorderLayout的JPanel对象 JPanel是一个可以添加用户界面的的容器。 要想获取JFrame或JApplet中的内容窗格,可以使用getContentPane()方法。如果性要把Container的一个实例设置为新的内容窗格,可以使用setContentPane()方法 玻璃窗格浮在最上面。默认情况下,javax.swing.JGlassPane第一个隐藏的窗格。除非使用玻璃窗格的 paint()方法,否则它是完全透明的。特可以监听根窗格的输入事件,一般来说,根窗格JRpptPane, 分层窗格JLayeredPane和玻璃窗格JGlassPane都不能直接使用 33.2.1 JFrame 框架JFrame是Frame的Swing版本,是java图形应用程序的顶级容器,他是已具有标题栏和边框的独立窗口显示的。 下面是JFrame中经常使用的属性 contentPane是框架的内容窗格 iconImage是表示框架的图像java swing 组件大全
java swing常用的9种组件.
(总结)Swing组件的使用
Swing组件的各种面板(JRootPane根面板,JLayeredPane层面板等)
Swing组件大全
swing组件总结认识
swing 组件和容器——java swing 组件技术(中)
第8章_Swing组件[1]
Swing组件详解
java Swing中各种组件的综合应用
swing基本组件说明