1、如何设置一个线程
1、方法一:通过继承Thread方法(包括匿名内部类)
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 1; i < 10; i++) {
try {
Thread.sleep(1000);//休眠
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
此时需要调用MyThread中的run方法,不过在调用时可以写作start();
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadTest1 {
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
}
}
}
2、通过实现Runnable接口
public class MyRnb implements Runnable {
@Override
public void run() {
for (int i = 1; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
在实现该接口后 有两种方式调用MyRnb中的run方法(直接实例化调用不可行!)
1、利用Thread类调用
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadTest2 {
public static void main(String[] args) {
Runnable mr = new MyRnb();
Thread test = new Thread(mr, "rnb");
test.start();
}
}
2、利用ExecutorService调用
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadTest3 {
public static void main(String[] args) {
Runnable mr = new MyRnb();
ExecutorService pool = Executors.newCachedThreadPool();
pool.execute(mr);
pool.shutdown();//运行完后关闭线程
}
}
2、Swing类的使用
1、创建一个可视化操作窗口 JFrame
JFrame jf = new JFrame();//创建一个窗口对象
jf.setBounds(20, 20, 1200, 600);//距离屏幕x轴距离,距离屏幕y轴距离,窗口长度,窗口高度
jf.setLayout(null);//将窗口的样式清空 这样可以自定义内部样式
jf.setVisible(true);//窗口可视化 设为true在运行会弹出窗口
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击关闭窗口按钮后,不仅关闭窗口java程序也停止
2、一些常见的自定义组件及其设置(此处其父容器都是窗口JFrame) jf.setLayout(null);
1、输入框 JTextField
JTextField textCal = new JTextField();//创建一个输入框对象
textCal.setBounds(20, 20, 200, 40);//距离父容器x轴距离,距离父容器y轴距离,输入框长度,输入框高度
jf.add(textCal);//将设置好的输入框添加进窗口jf中
2、按钮
1、创建
JButton jb = new JButton("计算");//创建一个按钮,可传入按钮上显示的字符串作为参数
jb.setBounds(550, 20, 80, 40);//距离父容器x轴距离,距离父容器y轴距离,按钮长度,按钮高度
frm.add(jb);//将设置好的按钮添加进窗口jf中
2、点击事件
jb.addActionListener(new ActionListener() {//利用匿名内部类编写点击时间的具体实现方式
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showConfirmDialog(jf, "按钮点击事件触发了!");//这是一个弹窗提示
}
});
3、下拉列表
JComboBox<String> jcb = new JComboBox<>();//创建一个下拉列表对象
jcb.setBounds(250, 20, 40, 40);//距离父容器x轴距离,距离父容器y轴距离,列表长度,列表高度
jcb.addItem("+");//该方法给下拉列表赋值,并增加一个下拉选项
jcb.addItem("-");
jcb.addItem("×");
jcb.addItem("÷");
frm.add(jcb);//将将设置好的下拉列表添加进窗口jf中
4、标签
JLabel result = new JLabel("", JLabel.CENTER);//创建一个标签对象,设置默认内容和文字位置(居中)
result.setBounds(660, 20, 400, 40);//距离父容器x轴距离,距离父容器y轴距离,标签长度,标签高度
result.setBorder(BorderFactory.createLineBorder(Color.black, 1, true));//设置边框颜色、宽度和是否环绕
frm.add(result);//将将设置好的标签添加进窗口jf中
5、常用设置
1、设置字体
setFont(new Font("", 0, 30));//字体名字(默认),字体粗细,字体大小
2、设置显示内容
setText("123");//设置显示内容文123,多用于标签和按钮
3、实现一个按钮控制的移动文本
import javax.swing.*;
import java.awt.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MovingLabel {
private static int labelX = 20;//label的x坐标
private static boolean flag = true;//判断label的移动是否停止
private static int count = 0;//判断是否在运动的状态下再次点击开始按钮
public void movingTank() {
JFrame jf = new JFrame();
jf.setBounds(20, 20, 1200, 600);
jf.setLayout(null);
JLabel label = new JLabel("坦克");
label.setBounds(20, 40, 80, 80);
label.setFont(new Font("", 0, 30));
jf.add(label);
Runnable rn = () -> {
flag = true;
do {//每次label x坐标+1实现右移
labelX++;
label.setBounds(labelX, 40, 80, 80);
try {
Thread.sleep(25);//通过控制休眠时间控制速度
} catch (InterruptedException ignored) {
}
} while (flag);
};
ExecutorService pool = Executors.newCachedThreadPool();
JButton startBtn = new JButton("开始");
startBtn.setBounds(20, 20, 60, 30);
jf.add(startBtn);
startBtn.addActionListener(e -> {
count++;//每点一次开始 count+1
if (count == 1) {//只有当count为0(程序默认为0,或被复位或停止按钮重置为0),才会0+1=1
pool.execute(rn);
} else {//如果已经点过开始,就会走这里弹窗提示
JOptionPane.showConfirmDialog(jf, "已经开始了,不要再点了!");
}
});
JButton resetBtn = new JButton("复位");
resetBtn.setBounds(100, 20, 60, 30);
jf.add(resetBtn);
resetBtn.addActionListener(e -> {
label.setBounds(20, 40, 80, 80);
labelX = 20;
flag = false;
count = 0;
});
JButton stopBtn = new JButton("停止");
stopBtn.setBounds(180, 20, 60, 30);
jf.add(stopBtn);
stopBtn.addActionListener(e -> {
flag = false;
count = 0;
});
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}