第11章 进度条、滑杆和分隔条
本章介绍三个Swing组件:JProgressBar、JSlider和JSeparator。
人们经常用进度条反映耗时任务已完成的百分比,本章将提供这样一个例子。但是,用ProgressMonitor和ProgressMonitorInputStream实用工具来反映一个任务的进度信息通常会更容易。“进度监控”小节中讨论了ProgressMonitor和ProgressMonitorInputStream实用工具。
JProgressBar和JSlider与JSeparator一样,用来描述一个介于最小值和最大值之间的值。因此,与JProgressBar和JSlider相关的模型是BoundedRangeModel接口的一个实现。
JSeparator是绘制一条蚀刻线的组件,它把逻辑上相关的组件分隔在一组,JSeparator组件可水平地垂直地放置。
11.1 JProgressBar
JProgressBar是一个简单的组件,它一般是一种颜色部分或完全填充的矩形。缺省情况下,进度条配备了一个凹陷的边框,并水平放置。
进度条还可以选择显示一个字符串,这个字符串在进度条矩形的中央位置上显示。这个字符串缺省时为耗时任务已完成的百分比。这个字符串可用JProgressBar.setString方法定制。
图11-1中示出的小应用程序创建了不同配置的进度条。
例11-1列出了图11-1中示出的小应用程序的代码。
例11-1 各种配置的进度条
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test extends JApplet {
private JProgressBar[] progressBars = {
new JProgressBar(),
new JProgressBar(),
new JProgressBar(),
new JProgressBar()
};
public void init() {
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout());
for(int i=0; i < progressBars.length; ++i) {
JProgressBar pb = progressBars[i];
if(i == 0) {
pb.setStringPainted(true);
pb.setString("Custom String");
}
if(i == 1) {
pb.setOrientation(JProgressBar.VERTICAL);
pb.setForeground(Color.yellow);
pb.setMaximum(1000);
pb.setValue(50);
pb.setBorder(
BorderFactory.createRaisedBevelBorder());
}
if(i == 2) {
pb.setForeground(Color.blue);
pb.setBorderPainted(false);
pb.setValue(50);
pb.setStringPainted(true);
}
if(i == 3) {
pb.setOrientation(JProgressBar.VERTICAL);
pb.setForeground(Color.red);
pb.setValue(90);
pb.setStringPainted(true);
pb.setBorder(
BorderFactory.createEtchedBorder());
}
contentPane.add(pb);
}
}
}
这个小应用程序创建了一组进度条,并为每个进度条设置了各种不同的属性,从而产生了图11-1中示出的各种不同配置。
11.1.1进度条与线程
例11-2 使用JProgressBar
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test extends JApplet {
private JProgressBar progressBar = new JProgressBar();
private JButton startButton = new JButton("start");
public void init() {
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.add(startButton);
contentPane.add(progressBar);
progressBar.setStringPainted(true);
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
(new UpdateThread()).start();
}
});
}
class UpdateThread extends Thread {
Runnable update, finish;
int value, min, max, increment;
public UpdateThread() {
max = progressBar.getMaximum();
min = progressBar.getMinimum();
update = new Runnable() {
public void run() {
value = progressBar.getValue() + increment;
updateProgressBar(value);
}
};
finish = new Runnable() {
public void run() {
updateProgressBar(min);
}
};
}
public void run() {
startButton.setEnabled(false);
while(value + increment <= max) {
simulateTimeConsumingActivity();
SwingUtilities.invokeLater(update);
}
SwingUtilities.invokeLater(finish);
startButton.setEnabled(true);
}
private void updateProgressBar(int value) {
progressBar.setValue(value);
}
private void simulateTimeConsumingActivity() {
try {
Thread.currentThread().sleep(1000);
increment = (max - min) / 10;
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
11.1.2 JProgressBar属性
11.1.3 JProgressBar事件
例11-3 监视一个进度条的值
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class Test extends JApplet {
private JProgressBar pb = new JProgressBar();
public void init() {
Container contentPane = getContentPane();
final JButton startButton = new JButton("start");
contentPane.setLayout(new FlowLayout());
contentPane.add(startButton);
contentPane.add(pb);
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
(new GetInfoThread(pb)).start();
}
});
pb.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
int min = pb.getMinimum(), max = pb.getMaximum();
int value = pb.getValue();
showStatus("Min: " + min + ", Max: " + max +
", Value: " + value);
}
});
}
}
class GetInfoThread extends Thread {
Runnable update, finish;
JProgressBar pb;
int value, min, max, increment;
public GetInfoThread(JProgressBar progressBar) {
pb = progressBar;
max = pb.getMaximum();
min = pb.getMinimum();
update = new Runnable() {
public void run() {
value = pb.getValue() + increment;
pb.setValue(value);
}
};
finish = new Runnable() {
public void run() {
value = min;
pb.setValue(value);
}
};
}
public void run() {
while(value + increment <= max) {
simulateTimeConsumingActivity();
SwingUtilities.invokeLater(update);
}
SwingUtilities.invokeLater(finish);
}
private void simulateTimeConsumingActivity() {
try {
Thread.currentThread().sleep(1000);
increment = (max - min) / 10;
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
11.1.4 JProgressBar类总结
11.1.5 AWT兼容
11.2 JSlider
例11-4 一个简单的JSlider例子
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class Test extends JApplet {
public void init() {
Container contentPane = getContentPane();
JSlider slider = new JSlider();
contentPane.add(slider, BorderLayout.NORTH);
}
}
11.2.1填充的滑杆
例11-5 一个填充的滑杆
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JApplet {
public Test() {
Container contentPane = getContentPane();
JSlider slider = new JSlider();
slider.putClientProperty("JSlider.isFilled",Boolean.TRUE);
contentPane.add(slider, BorderLayout.NORTH);
}
}
11.2.2滑杆间隔标记
例11-6 显示滑杆的间隔标记
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class Test extends JApplet {
public void init() {
Container contentPane = getContentPane();
JSlider slider = new JSlider();
JPanel controlPanel = new ControlPanel(slider);
contentPane.setLayout(new BorderLayout(0,40));
contentPane.add(controlPanel, BorderLayout.NORTH);
contentPane.add(slider, BorderLayout.CENTER);
}
class ControlPanel extends JPanel {
public ControlPanel(final JSlider slider) {
JCheckBox paintTicks = new JCheckBox("Paint Ticks");
JComboBox minorSpacing = new JComboBox(),
majorSpacing = new JComboBox();
minorSpacing.addItem("0");
minorSpacing.addItem("3");
minorSpacing.addItem("5");
minorSpacing.addItem("10");
minorSpacing.addItem("20");
majorSpacing.addItem("0");
majorSpacing.addItem("3");
majorSpacing.addItem("5");
majorSpacing.addItem("10");
majorSpacing.addItem("20");
add(paintTicks);
add(new JLabel("Minor Tick Spacing:"));
add(minorSpacing);
add(new JLabel("Major Tick Spacing:"));
add(majorSpacing);
paintTicks.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JCheckBox cb = (JCheckBox)e.getSource();
slider.setPaintTicks(cb.isSelected());
slider.repaint();
}
});
minorSpacing.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
JComboBox cb = (JComboBox)e.getSource();
int spacing = Integer.parseInt(
(String)cb.getSelectedItem());
slider.setMinorTickSpacing(spacing);
slider.revalidate();
}
});
majorSpacing.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
JComboBox cb = (JComboBox)e.getSource();
int spacing = Integer.parseInt(
(String)cb.getSelectedItem());
slider.setMajorTickSpacing(spacing);
slider.revalidate();
}
});
}
}
}
11.2.3滑杆标签
例11-7 显示缺省的JSlider标签
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JApplet {
public Test() {
Container contentPane = getContentPane();
JSlider slider = new JSlider();
slider.setPaintLabels(true);
slider.setMajorTickSpacing(20);
contentPane.add(slider, BorderLayout.NORTH);
}
}
例11-8 定制滑杆标签
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JApplet {
public Test() {
Container contentPane = getContentPane();
JSlider slider = new JSlider();
Icon[] icons = {
new ImageIcon("basketball.gif"),
new ImageIcon("baseball.gif"),
new ImageIcon("soccer.gif"),
new ImageIcon("clipboard.gif"),
new ImageIcon("filmstrip.gif"),
new ImageIcon("crab.gif"),
};
Hashtable table = new Hashtable();
for(int i=0, loc=0; i < icons.length; i++, loc += 20) {
table.put(new Integer(loc),
new JLabel(Integer.toString(loc),
icons[i],
JLabel.LEFT));
}
slider.setLabelTable(table);
slider.setPaintLabels(true);
slider.setMajorTickSpacing(20);
contentPane.add(slider, BorderLayout.NORTH);
}
}
11.2.4反转滑杆值
例11-9 中列出图11-10中示出的小应用程序的代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JApplet {
private JCheckBox checkBox = new JCheckBox("Invert");
private JSlider[] sliders = { new JSlider(),
new JSlider(JSlider.VERTICAL) };
public Test() {
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.add(checkBox);
for(int i=0; i < sliders.length; ++i) {
sliders[i].setPaintLabels(true);
sliders[i].setMajorTickSpacing(20);
contentPane.add(sliders[i]);
}
checkBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for(int i=0; i < sliders.length; ++i)
sliders[i].setInverted(checkBox.isSelected());
}
});
}
}
11.2.5滑杆的外延值
例11-10 设置一个滑杆的外延值
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Test extends JApplet {
public Test() {
Container contentPane = getContentPane();
JSlider slider = new JSlider();
JPanel controlPanel = new ControlPanel(slider);
contentPane.add(controlPanel, BorderLayout.NORTH);
contentPane.add(slider, BorderLayout.SOUTH);
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider s = (JSlider)e.getSource();
showStatus("Min: " + s.getMinimum() +
", Max: " + s.getMaximum() +
", Extent: " + s.getExtent() +
", Value: " + s.getValue());
}
});
}
}
class ControlPanel extends JPanel {
public ControlPanel(final JSlider slider) {
JComboBox extent = new JComboBox();
extent.addItem("0");
extent.addItem("10");
extent.addItem("20");
extent.addItem("30");
extent.addItem("40");
add(new JLabel("Extent:"));
add(extent);
extent.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
JComboBox cb = (JComboBox)e.getSource();
int ext = Integer.parseInt(
(String)cb.getSelectedItem());
slider.setExtent(ext);
slider.revalidate();
}
});
}
}
11.2.6 JSlider属性
11.2.7 JSlider事件
例11-11 监视一个滑杆的值
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Test extends JApplet {
public Test() {
Container contentPane = getContentPane();
JSlider slider = new JSlider();
contentPane.add(slider, BorderLayout.NORTH);
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider s = (JSlider)e.getSource();
showStatus("Min: " + s.getMinimum() +
", Max: " + s.getMaximum() +
", Extent: " + s.getExtent() +
", Value: " + s.getValue() +
", Value Is Adjusting: " +
s.getValueIsAdjusting());
}
});
}
}
11.2.8 JSlider类总结
11.2.9 AWT兼容
11.3 JSeparator
例11-12 一个不可见的分隔条
import java.awt.*;
import javax.swing.*;
public class Test extends JApplet {
public void init() {
Container contentPane = getContentPane();
JSeparator s = new JSeparator(JSeparator.VERTICAL);
contentPane.setLayout(new FlowLayout());
contentPane.add(new JButton("left"));
contentPane.add(s);
contentPane.add(new JButton("right"));
}
}
例11-13 控制分隔条的大小
import java.awt.*;
import javax.swing.*;
public class Test extends JApplet {
public void init() {
Container contentPane = getContentPane();
JSeparator s = new JSeparator(JSeparator.VERTICAL);
Dimension ps = s.getPreferredSize();
contentPane.setLayout(new FlowLayout());
contentPane.add(new JButton("left"));
contentPane.add(s);
contentPane.add(new JButton("right"));
s.setPreferredSize(new Dimension(ps.width, 50));
}
}
例11-14 监控分隔条的大小
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JApplet {
public void init() {
Container contentPane = getContentPane();
final JSeparator s =
new JSeparator(JSeparator.VERTICAL);
final Dimension ps = s.getPreferredSize();
contentPane.setLayout(new FlowLayout());
contentPane.add(new JButton("left"));
contentPane.add(s);
contentPane.add(new JButton("right"));
addComponentListener(new ComponentAdapter() {
public void componentShown(ComponentEvent e) {
System.out.println("shown");
adjustSeparatorPreferredSize();
}
public void componentResized(ComponentEvent e) {
System.out.println("resized");
adjustSeparatorPreferredSize();
}
private void adjustSeparatorPreferredSize() {
s.setPreferredSize(new Dimension(ps.width,
getSize().height));
s.revalidate();
}
});
}
}
11.3.1分隔条与框
例11-15 分隔条与框
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JApplet {
private JPanel left, rightTop, rightBottom;
private Box box = new Box(BoxLayout.X_AXIS),
rightBox = new Box(BoxLayout.Y_AXIS);
private JSeparator vs, hs; // vs = vertical separator
// hs = horizontal separator
public void init() {
createBoxes();
setPanelBorders();
//setSeparatorPreferredSizes();
left.setPreferredSize(new Dimension(150,0));
getContentPane().add(box, BorderLayout.CENTER);
}
private void createBoxes() {
Component vStrut = box.createVerticalStrut(10),
hStrut = box.createHorizontalStrut(10);
rightBox.add(rightTop = new JPanel());
rightBox.add(box.createVerticalStrut(10));
rightBox.add(hs = new JSeparator());
rightBox.add(box.createVerticalStrut(10));
rightBox.add(rightBottom = new JPanel());
box.add(left = new JPanel());
box.add(box.createHorizontalStrut(10));
box.add(vs = new JSeparator(JSeparator.VERTICAL));
box.add(box.createHorizontalStrut(10));
box.add(rightBox);
}
private void setSeparatorPreferredSizes() {
vs.setMaximumSize(
new Dimension(vs.getPreferredSize().width,
Integer.MAX_VALUE));
hs.setMaximumSize(
new Dimension(Integer.MAX_VALUE,
hs.getPreferredSize().height));
}
private void setPanelBorders() {
left.setBorder(
BorderFactory.createTitledBorder("Left"));
rightTop.setBorder(
BorderFactory.createTitledBorder("Right Top"));
rightBottom.setBorder(
BorderFactory.createTitledBorder("Right Bottom"));
}
}
11.3.2 JSeparator属性
略
11.3.3 JSeparator事件
略
11.3.4 AWT兼容
略
相关推荐
在Java编程语言中,滑杆(Slider)是一种常用的图形用户界面(GUI)组件,它允许用户通过拖动滑块在指定范围内选择一个值。滑杆通常用于调整音量、进度控制或者设置数值参数等场景,因为它们提供了直观的用户体验。...
在iOS开发中,滑杆(Slider)是一种常见的用户界面元素,用于让用户选择一个范围内的值。自定义滑杆是提高应用程序交互性和个性化设计的重要手段。本项目提供的"ios-iOS自定义滑杆,动态定义滑杆数目,显示滑杆数值....
Java Swing 是Java平台上的一个图形用户界面(GUI)工具包,用于构建桌面应用程序。它提供了丰富的组件库,使得开发者能够创建具有美观界面的应用程序。在本文中,我们将深入探讨Java Swing的一些基本概念和核心组件...
Swift3中的滑杆组件,全称为CHRangeSlider,是一个高度可定制的UI控件,专为iOS应用设计,用于实现多点滑动控制。在Swift3的编程环境中,这个组件提供了一种新颖的方式,允许用户通过一个单一的滑杆同时调整多个值。...
行业资料-交通装置-一种公交车双升降滑杆拉手.exe
第11章 运行期类型鉴定 11.1 对RTTI的需要 11.1.1 Class对象 11.1.2 造型前的检查 11.2 RTTI语法 11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 ...
在iOS开发中,滑杆(Slider)是一种常见的用户界面元素,用于让用户选择一个范围内的值。这个自定义滑杆组件,名为"ZHPSlider",提供了更丰富的功能和自定义选项,包括支持纵向和横向滑动,以及设置正向和逆向的排序...
第11章 示例描述:介绍并演示AWT的使用。 FrameEx.java 建立空窗口的程序 FlowLayoutEx2.java FlowLayout的使用 第12章 示例描述:介绍并演示Swing组件的使用。 swingText3.java 按钮的使用 swingText5....
这个“超实用java控件美化及日常应用源码”集合提供了多个实例,帮助开发者深入理解和实践Java GUI(图形用户界面)的设计与实现。以下是对每个实例的详细解释: 1. **实例1:产生自己的控件** - 这个实例展示了...
本文将深入探讨如何在iOS应用中实现这样一个垂直滑杆,并提供相关的设计和实现策略。 首先,我们要了解iOS中的滑杆组件。在UIKit框架中,滑杆(UISlider)通常用于用户调整数值或选择范围,其默认行为是沿水平方向...
本资源包含Swing方面的基础知识: 01分解颜色 02画板 03帧 04画布 05密码验证界面 06对话框 07滚动条 08边框 09单选框图片浏览器 10卡片布局管理器 11边界布局管理器 12进程条 13列表框和组合框 14选项卡 15菜单 16...
在Microsoft Foundation Classes (MFC)库中,滑杆滚动条是一种常见的用户界面元素,用于提供对大量数据或视图的导航。MFC是Microsoft为Windows应用程序开发提供的C++类库,它封装了Windows API,使得开发者能更方便...
本项目为基于Java开发的RangeSeekBar双向滑动滑杆设计源码,包含44个文件,涵盖19个XML布局文件、6个Java源代码文件、4个Gradle构建脚本文件、3个Git忽略规则文件以及少量PNG图片、配置文件和文档等,支持双向和单向...
∞Vue无限滑杆:level_slider:无限滑杆组件(无依赖关系,重量轻1.48 KB):eyes:文档和演示页LIVE DEMO:laptop:安装npm i∞Vue无限滑杆:level_slider:无限滑动杆构件(无依赖关系,重量轻1.48 KB):eyes:文档和演示...
Swing是Java提供的一个图形用户界面(GUI)工具包,它扩展了Java AWT(Absolute Window Toolkit),提供了更丰富的组件和功能。 ```java import javax.swing.*; import java.awt.*; ``` 接着,我们将创建一个JFrame,...
jQuery UI控制滑杆插件是一款基于CSS3和jQuery UI的控制滑杆插件,这款控制滑杆是在HTML5滑杆元素的基础上进行自定义CSS3渲染,所以外观更加漂亮。另外,这款控制滑杆插件是纵向的,当然你也可以通过设置让它水平...
第11章 运行期类型鉴定 11.1 对RTTI的需要 11.1.1 Class对象 11.1.2 造型前的检查 11.2 RTTI语法 11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 ...
在iOS开发中,UISlider是用户界面中一个重要的控件,用于表示和调整数值范围。本资源"(0107)-iOS/iPhone/iPAD/iPod源代码-滑杆(Slider)-Themed Slider"专注于自定义UISlider的外观和功能,帮助开发者创建更...
第11章 运行期类型鉴定 11.1 对RTTI的需要 11.1.1 Class对象 11.1.2 造型前的检查 11.2 RTTI语法 11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 ...
第11章 运行期类型鉴定 11.1 对RTTI的需要 11.1.1 Class对象 11.1.2 造型前的检查 11.2 RTTI语法 11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 ...