外观
其他组件
菜单栏——JMenuBar类、JMenu类、JMenuItem类
菜单栏和下拉列表框比较类似,只是它会显示在标题下方,窗体的上部分。菜单栏是窗体的一个组件,菜单栏使用JMenuBar表示;一个窗体只能设置一个菜单栏,一个菜单栏可以包含多个菜单项,菜单项用JMenu表示;每一个菜单项相当于一个下拉列表框,而一个菜单项里面可以有很多子项,子项用JMenuItem表示。
JMenuBar类只有一个无参的构造方法。
JMenuBar类的常用成员方法如下:
创建菜单栏对象后,可以使用add(JMenu c)添加一个菜单项。
JMenu类的构造方法如下:
JMenu(String text):创建一个带有文本的菜单项。
创建菜单项对象后,可以使用add(JMenuItem menuItem)添加菜单子项。
JMenuItem类的构造方法如下:
public JMenuItem():创建一个不带文本的菜单子项。public JMenuItem(Icon icon):创建一个带有图标的菜单子项。public JMenuItem(String text):创建一个带有文本的菜单子项。public JMenuItem(String text, Icon icon):创建一个带有图标和文本的菜单子项。
实例化JMenuItem类后,可以使用addActionListener()方法添加事件监听,实现菜单栏该有的功能。
最后,调用窗体对象的setMenuBar()方法设置菜单栏就可以了。
示例代码:
package swing.OtherSwing;
import javax.swing.*;
public class DemoJMenu extends JFrame {
public DemoJMenu() {
super("菜单栏使用");
setVisible(true);
setBounds(500, 400, 500, 500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//JMenuItem类:菜单项类,是菜单的子项
JMenuItem jMenuItem1 = new JMenuItem("子项1");
JMenuItem jMenuItem2 = new JMenuItem("子项2");
//可以为此菜单项添加事件监听
jMenuItem2.addActionListener(e -> JOptionPane.showMessageDialog(this, "点击了“子项2”"));
//JMenu可定义一个菜单项,使用此菜单项的add方法添加子项
JMenu jMenu = new JMenu("菜单");
jMenu.add(jMenuItem1);
jMenu.add(jMenuItem2);
//JMenuBar菜单栏类,使用add方法添加菜单,使用窗体的setJMenuBar()方法就可以设置此窗体的菜单栏了
JMenuBar jMenuBar = new JMenuBar();
jMenuBar.add(jMenu);
setJMenuBar(jMenuBar);
}
public static void main(String[] args) {
new DemoJMenu();
}
}运行结果:

在点击这两个菜单项的第二个后,就会弹出一个对话框显示信息。
滚动条——JSlider类
滚动条具有一段长度,被分为101个节点,100份,可以使用滚动条调节一些数值的百分比。滚动条使用JSlider表示,它的构造方法如下:
public JSlider()。public JSlider(int orientation)。public JSlider(int min, int max)。public JSlider(int min, int max, int value)。public JSlider(int orientation, int min, int max, int value)。
参数orientation代表滚动条的方向,默认是水平;min和max指定滚动条的最大和最小长度;value指滚动条刚创建时所在的位置。
JSlider的常用方法如下:
public int getValue():返回滚动条目前所在位置。public void setValue(int n):设置滚动条所在位置。public void setFont(Font font):设置滚动条文字的显示字体。public void addChangeListener(ChangeListener l):给滚动条添加事件监听,在滚动条值被改变时触发。
示例代码:
package swing.OtherSwing;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.IOException;
public class DemoJSlider extends JFrame {
private final JSlider jSlider;
Image img;
public DemoJSlider() {
try {
img = ImageIO.read(new File("src/JavaDraw/img.jpg"));// 读取图片文件
} catch (IOException e) {
e.printStackTrace();
}
CanvasPanel canvas = new CanvasPanel();
jSlider = new JSlider();
jSlider.setMaximum(1000);
jSlider.setValue(100);
jSlider.setMinimum(1);
jSlider.addChangeListener(e -> canvas.repaint());
JPanel center = new JPanel();
center.setLayout(new BorderLayout());
center.add(jSlider, BorderLayout.SOUTH);
center.add(canvas, BorderLayout.CENTER);
setContentPane(center);
setBounds(100, 100, 800, 600); // 设置窗体大小和位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭模式
setTitle("绘制图片");
}
public static void main(String[] args) {
new DemoJSlider().setVisible(true);
}
class CanvasPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g);
int newW, newH;
int imgWidth = img.getWidth(this); // 获取图片宽度
int imgHeight = img.getHeight(this); // 获取图片高度
float value = jSlider.getValue();// 滑块组件的取值
newW = (int) (imgWidth * value / 100);// 计算图片放大后的宽度
newH = (int) (imgHeight * value / 100);// 计算图片放大后的高度
g.drawImage(img, 0, 0, newW, newH, this);// 绘制指定大小的图片
}
}
}运行结果:

在滑动下方滚动条时,图片的大小也会改变。

进度条——JProgressBar类
进度条有两种状态:具有确切值和不具有确切值。进度条使用JProgressBar表示,它的构造方法如下:
public JProgressBar():创建一个最小值为0,最大值为100的进度条。public JProgressBar(int min, int max):指定进度条的最大值和最小值。
JProgressBar类的常用方法如下:
setBorderPainted(boolean b):设置是否绘制进度条边框。getValue():返回进度条此时的值。setValue(int value):设置进度条的值。public void setIndeterminate(boolean newValue):设置进度条是处于确切值状态还是不确切状态。setOrientation(int newOrientation):设置进度条的方向。setString(String s):设置进度字符串的值。
在实际使用中,一般使用一个线程来单独控制进度条的值。
使用确切值示例代码如下:
package swing.JProgressBar;
import javax.swing.*;
public class DemoJProgressBar1 extends JFrame {
//本文件演示如何使用带有确切值的进度条 以及一些常用方法
private DemoJProgressBar1() {
super("进度条演示");
setBounds(400, 300, 400, 300);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JProgressBar jProgressBar = new JProgressBar();
//使用不带参数的构造方法就可以创建最小为0最大为100的进度条
jProgressBar.setStringPainted(true); //该方法用于设置进度条是否显示数字
jProgressBar.setBorderPainted(true); //设置 borderPainted 属性,如果进度条应该绘制其边框,则此属性为 true
System.out.println("进度条的最小值为:" + jProgressBar.getMinimum()); //返回进度条的最小值
System.out.println("进度条的最大值为:" + jProgressBar.getMaximum()); //返回进度条的最大值
getContentPane().add(jProgressBar);
Thread t = new Thread(() -> {
for (int i = 0; i <= 100; i++) {
jProgressBar.setValue(i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (jProgressBar.getValue() == 50) { //返回进度条的值
System.out.println("进度条已完成50%");
}
if (jProgressBar.getValue() == 100) { //返回进度条的值
System.out.println("进度条已完成");
}
}
});
t.start();
}
public static void main(String[] args) {
new DemoJProgressBar1().setVisible(true);
}
}运行结果如下。进度条初始值为0,会随时间逐渐增大。
