当前位置: 首页 > news >正文

Java实现简单小画板

Java制作简单画板,包括两个类,一个主要画板类Drawpad,一个画板监听器DrawListener类。

1、Drawpad类,包括画板,画板功能设计,保存图片等

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

package Java课程设计;

import java.awt.Graphics;

import javax.imageio.ImageIO;

import javax.print.DocFlavor.STRING;

import javax.swing.ImageIcon;

import javax.swing.JDialog;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JTextArea;

import javax.swing.JTextField;

import javax.swing.UIManager;

import javax.swing.UnsupportedLookAndFeelException;

import java.awt.AWTException;

import java.awt.BasicStroke;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Component;

import java.awt.Container;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.Graphics2D;

import java.awt.Rectangle;

import java.awt.Robot;

import java.awt.Shape;

import java.awt.Window;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.image.BufferedImage;

import java.awt.image.ColorModel;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.util.ArrayList;

import javax.swing.JButton;

import javax.swing.filechooser.FileNameExtensionFilter;

public class Drawpad {

?? ? static Color color1;

public static void main(String[] args) {

?? ?Drawpad dp = new Drawpad();

?? ?dp.initUI();

?? ??

} ?

? ?//创建一个JFrame图形窗口

?? ?public void initUI() {

?? ??? ?JFrame jf = new JFrame();

?? ??? ?jf.setTitle("创意画图板(勿拖动)");

?? ??? ?jf.setSize(1500,1000);

?? ??? ?jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭时退出

?? ??? ?jf.setLocationRelativeTo(null);//居中,不用定位窗口大小

?? ??? ?//创建字体,之后所有的字体为该字体

?? ??? ?Font f=new Font("方正仿宋简体", Font.BOLD, 20);

?? ??? ?//创建画笔监听器

?? ??? ?DrawListener ?dl = new DrawListener();

?? ??? ?//创建读取图片BufferedImage(将图片加载到drawPanel面板中)和画笔g,画笔g为在保存图片上进行图画。

?? ??? ??? ? ? ?BufferedImage bi = new BufferedImage(1300,800, BufferedImage.TYPE_INT_ARGB);

?? ??? ??? ? ? ?Graphics2D g = bi.createGraphics();

?? ??? ??? ? ? ?//初始化时填充白色

?? ??? ??? ? ? ?g.setColor(Color.WHITE);

?? ??? ??? ? ? ?//先将图片填充为白色

?? ??? ??? ??? ?g.fillRect(0, 0, 1300,800);

?? ??? ??? ??? ?

?? ??? ??? ??? ?

?? ??? ?//设置增加菜单栏,包括保存和新建两个按钮

?? ??? ?JMenuBar box=new JMenuBar();

?? ??? ?//在窗体上加菜单条,做一个菜单条,是菜单条,不是工具栏

?? ??? ?//创建menubtn1保存按钮,并加上监听器,以图片的形式保存绘画板上的内容

?? ??? ?JButton menubtn1=new JButton("保存");

?? ??? ?//为保存按钮注册监听器

?? ??? ? ?menubtn1.addActionListener(new ActionListener(){

? ? ??? ??? ??? ?@Override

? ? ??? ??? ??? ?public void actionPerformed(ActionEvent arg0) {

? ? ??? ??? ??? ??? ?//创建文件保存窗口

? ? ??? ??? ??? ??? ?JFileChooser f=new JFileChooser("保存");

? ? ??? ??? ??? ??? ?int returnVal = f.showSaveDialog(null);

? ? ??? ??? ??? ??? ?

?? ??? ??? ??? ??? ?File?? ?file1=null;

?? ??? ??? ??? ??? ?if(returnVal == JFileChooser.APPROVE_OPTION) {

?? ??? ??? ??? ??? ? ? ?file1 =f.getSelectedFile();

?? ??? ??? ??? ??? ??? ?String name = f.getName(file1);

?? ??? ??? ??? ??? ??? ?try {

?? ??? ??? ??? ??? ??? ??? ?

?? ??? ??? ??? ??? ??? ??? ?ImageIO.write(bi, "PNG", new File(f.getCurrentDirectory(),name+".png"));

?? ??? ??? ??? ??? ??? ?} catch (IOException e) {

?? ??? ??? ??? ??? ??? ??? ?//需抛出异常

?? ??? ??? ??? ??? ??? ??? ?// TODO Auto-generated catch block

?? ??? ??? ??? ??? ??? ??? ?e.printStackTrace();

?? ??? ??? ??? ??? ??? ?}

?? ??? ??? ??? ??? ?}

? ? ??? ??? ??? ?}

? ? ??? ??? ? });

?? ??? ? /*JButton menubtn2=new JButton("打开");

?? ??? ? ?//为打开按钮注册监听器

?? ??? ? ?menubtn1.addActionListener(new ActionListener(){

? ??? ??? ??? ?@Override

? ??? ??? ??? ?//获取当前画笔粗细

? ??? ??? ??? ?public void actionPerformed(ActionEvent arg0) {

? ??? ??? ??? ??? ?BufferedImage bimg = null;

? ??? ??? ??? ??? ?JFileChooser f=new JFileChooser("打开");

??? ??? ??? ??? ?int returnVal = f.showOpenDialog(null);

??? ??? ??? ??? ?

?? ??? ??? ??? ?File?? ?file1=null;

?? ??? ??? ??? ?if(returnVal == JFileChooser.APPROVE_OPTION) {

?? ??? ??? ??? ? ? ?file1 =f.getSelectedFile();

?? ??? ??? ??? ??? ?String name = f.getName(file1);

?? ??? ??? ??? ??? ?try {

? ? ? ? ? ? ? ? ? ? ??

?? ??? ??? ??? ??? ?} catch (IOException e) {

?? ??? ??? ??? ??? ??? ?// TODO Auto-generated catch block

?? ??? ??? ??? ??? ??? ?e.printStackTrace();

?? ??? ??? ??? ??? ?}

?? ??? ??? ??? ?}

? ??? ??? ??? ??? ?

? ??? ??? ??? ??? ?

? ??? ??? ??? ?}

? ??? ??? ? });*/

?? ??? ? ?

?? ??? ?//创建menubtn3退出按钮,并加上监听器,退出程序

?? ??? ? ?JButton menubtn3=new JButton("退出");

?? ??? ? ?menubtn3.addActionListener(new ActionListener(){

?? ? ? ?? ??? ??? ?@Override

?? ? ? ?? ??? ??? ?//获取当前画笔粗细

?? ? ? ?? ??? ??? ?public void actionPerformed(ActionEvent arg0) {

?? ? ? ?? ??? ??? ??? ?int ret=JOptionPane.showConfirmDialog(null, "你确定要退出吗", "确认退出", JOptionPane.YES_NO_OPTION);

?? ? ? ?? ??? ??? ??? ?if(ret==JOptionPane.YES_OPTION){

?? ? ? ?? ??? ??? ??? ??? ?//“确认”退出程序

?? ? ? ?? ??? ??? ??? ??? ?System.exit(0);

?? ? ? ?? ??? ??? ??? ?}

?? ? ? ?? ??? ??? ?}

?? ? ? ?? ??? ? });

?? ??? ? ?box.add(menubtn1);

?? ??? ? // box.add(menubtn2);

?? ??? ? ?box.add(menubtn3);

?? ??? ?//jf.setJMenuBar(box);

?? ??? ?

?? ??? ?jf.setJMenuBar(box);

?? ??? ?

?? ??? ?//jf用BorderLayout布局

?? ??? ?

?? ??? ?//北边,画板模式功能栏

?? ??? ?JPanel funcPanel=new JPanel();

?? ??? ?jf.add(funcPanel,BorderLayout.NORTH);

?? ??? ?

?? ??? ?//中间,画布

?? ??? ?JPanel drawPanel=new JPanel();

?? ??? ?jf.add(drawPanel,BorderLayout.CENTER);

?? ??? ?drawPanel.setPreferredSize(new Dimension(1000,700));

?? ??? ?drawPanel.setBackground(dl.background);

?? ??? ?//一定要在画布上加上监听器!!1若画布没有加上监听器,无法显示

?? ??? ?drawPanel.addMouseListener(dl);

?? ??? ?drawPanel.addMouseMotionListener(dl);

?? ??? ?

?? ??? ?//南边,为画笔颜色选择按钮

?? ??? ?JPanel colorPanel=new JPanel();

?? ??? ?jf.add(colorPanel,BorderLayout.SOUTH);

?? ??? ?

?? ??? ?//右边,为选择背景颜色按钮、画笔粗细选择按钮

?? ??? ?JPanel backgroundPanel=new JPanel();

?? ??? ?jf.add(backgroundPanel,BorderLayout.EAST);

?? ??? ?backgroundPanel.setPreferredSize(new Dimension(150,1000));

?? ??? ?

?? ??? ?//左边,获取当前状态如:背景颜色、画笔颜色、画笔性质

?? ??? ?JPanel nowPanel=new JPanel();

?? ??? ?jf.add(nowPanel,BorderLayout.WEST);

?? ??? ?nowPanel.setPreferredSize(new Dimension(180,1000));

?? ??? ?

?? ??? ?//左边放入当前状态Panel

?? ??? ?nowPanel.setBackground(Color.WHITE);

?? ??? ? JLabel label2=new JLabel("当前背景颜色");

?? ??? ? ?label2.setFont(f);

?? ??? ? ? nowPanel.add(label2);

?? ??? ? ? //放入当前背景颜色

?? ??? ? ? JButton nowbackgroundColor=new JButton();

? ? ? ? ? ?nowbackgroundColor.setPreferredSize(new Dimension(60,60));

? ? ? ? ? ?nowbackgroundColor.setBackground(Color.WHITE);//背景初始化为灰色

?? ??? ? ? nowPanel.add(nowbackgroundColor);

?? ??? ? ? //放入当前画笔

?? ??? ? ? JLabel label3=new JLabel("请选择画笔模式");

?? ??? ??? ? ?label3.setFont(f);

?? ??? ??? ? ? nowPanel.add(label3);

?? ??? ? ? //放入当前画笔颜色

?? ??? ? ? JButton nowColor=new JButton();

? ? ? ? ? ?nowColor.setPreferredSize(new Dimension(60,60));

? ? ? ? ? ?nowColor.setBackground(Color.BLACK);//画笔颜色初始化为黑色色

?? ??? ? ? nowPanel.add(nowColor);

?? ??? ? ?

?? ??? ??? ?//获取当前画笔模式

?? ??? ??? ?JLabel label4=new JLabel("当前画笔模式");

?? ??? ??? ? ?label4.setFont(f);

?? ??? ??? ? ? nowPanel.add(label4);

?? ??? ??? ? ? JTextField text=new JTextField(dl.btncontent); //获得选择画笔模式的按钮内容,得到当前画笔模式

?? ??? ??? ? ? text.setPreferredSize(new Dimension (160,60));

?? ??? ??? ? ? text.setFont(f);

?? ??? ??? ? ? text.setEditable(false); ?//不可改

?? ??? ??? ?nowPanel.add(text);

?? ??? ??? ?//获取当前画笔粗细状态

?? ??? ??? ?JLabel label6=new JLabel("当前画笔粗细(中)"); ?//默认粗细为中

?? ??? ??? ? ?label6.setFont(f);

?? ??? ??? ? ? nowPanel.add(label6);

?? ??? ??? ? ? JTextField text1=new JTextField("请选择画笔粗细");

?? ??? ??? ? ? text1.setPreferredSize(new Dimension (160,60));

?? ??? ??? ? ? text1.setFont(f);

?? ??? ??? ? ? text1.setEditable(false); //不可编辑

?? ??? ??? ?nowPanel.add(text1);

?? ??? ??? ?//输入需要添加的文字

?? ??? ??? ?JLabel label7=new JLabel("请输入文字:");

?? ??? ??? ? ?label7.setFont(f);

?? ??? ??? ? ? nowPanel.add(label7);

?? ??? ??? ? ? JTextField text2=new JTextField();

?? ??? ??? ? ? text2.setPreferredSize(new Dimension (160,60));

?? ??? ??? ? ? text2.setFont(f);

?? ??? ??? ? ? nowPanel.add(text2);?

?? ??? ??? ? ? JLabel label8=new JLabel("请输入文字样式:");

?? ??? ??? ??? ? ?label8.setFont(f);

?? ??? ??? ??? ? ? nowPanel.add(label8);

?? ??? ??? ??? ? ? JTextField text3=new JTextField("方正仿宋简体");

?? ??? ??? ??? ? ? text3.setPreferredSize(new Dimension (160,60));

?? ??? ??? ??? ? ? text3.setFont(f);

?? ??? ??? ??? ? ? nowPanel.add(text3);

?? ??? ??? ??? ? ? JLabel label9=new JLabel("请输入文字大小:");

?? ??? ??? ??? ??? ? ?label9.setFont(f);

?? ??? ??? ??? ??? ? ? nowPanel.add(label9);

?? ??? ??? ??? ??? ? ? JTextField text4=new JTextField("20");

?? ??? ??? ??? ??? ? ? text4.setPreferredSize(new Dimension (160,60));

?? ??? ??? ??? ??? ? ? text4.setFont(f);

?? ??? ??? ??? ??? ? ? nowPanel.add(text4);

?? ??? ??? ?//为获取文字内容加一个按钮并加上监听器

?? ??? ??? ? ? JButton getcontent=new JButton("获取文字");

?? ??? ??? ? ? getcontent .setFont(f);

?? ??? ??? ??? ?getcontent.setBackground(Color.YELLOW);

?? ??? ??? ??? ?getcontent.addActionListener(new ActionListener(){

?? ??? ??? ??? ??? ?@Override

?? ??? ??? ??? ??? ?public void actionPerformed(ActionEvent e) {

?? ??? ??? ??? ??? ??? ? String content=text2.getText();

?? ??? ??? ??? ??? ??? ?String mode=text3.getText();

?? ??? ??? ??? ??? ??? ?String size=text4.getText();

?? ??? ??? ??? ??? ??? ?dl.mode=mode; //获取文字样式

?? ??? ??? ??? ??? ??? ? ? dl.content=content; //获取文字内容

?? ??? ??? ??? ??? ??? ? ? dl.size=size; //获取文字大小

?? ??? ??? ??? ??? ?}

?? ??? ??? ??? ? });

?? ??? ??? ??? ?nowPanel.add(getcontent);

?? ??? ??? ??? ?

?? ??? ??? ??? ?//最后在当前状态画板中加一个清除画布内容的功能

?? ??? ??? ??? ?JButton clear=new JButton("清除");

?? ??? ??? ??? ? ?clear.setFont(f);

?? ??? ??? ??? ??? ?clear.setBackground(Color.RED);

?? ??? ??? ??? ??? ?clear.addActionListener(dl);

?? ??? ??? ??? ??? ?nowPanel.add(clear);

?? ??? ??? ??? ??? ?

?? ??? ?//添加按钮到北边(每个按钮写两行代码太多,通过数组方式添加按钮)

?? ??? ??? ??? ?//加入标签(选择画笔模式)

?? ??? ??? ??? ?JLabel labelh =new JLabel("选择画笔模式");

?? ??? ??? ??? ?labelh.setFont(f);

?? ??? ??? ??? ?funcPanel.add(labelh);

?? ??? ??? ??? ?//将按钮名字保存在数组中,后依次存储

?? ??? ?String[] btnstr= {"画笔","直线","矩形","填充矩形","圆","填充圆","弧线","喷枪","波形","分形","长方体","九宫格递归","文字","橡皮"};

?? ??? ?//将画笔状态按钮防置panel中

?? ??? ?for( int i=0;i<btnstr.length;i++) {

?? ??? ??? ?JButton btn=new JButton(btnstr[i]);

?? ??? ??? ?funcPanel.add(btn);

?? ??? ??? ?btn .setFont(f);

?? ??? ??? ?btn.setBackground(Color.white);

?? ??? ??? ?//加上画笔监听器

?? ??? ??? ?btn.addActionListener(dl);

?? ??? ??? ?//加上监听器:获取当前 画笔模式

?? ??? ??? ?btn.addActionListener(new ActionListener(){

?? ??? ??? ??? ?@Override

?? ??? ??? ??? ?public void actionPerformed(ActionEvent e) {

?? ??? ??? ??? ??? ?text.setText(btn.getText()); //在当前模式加入选取的画笔模式

?? ??? ??? ??? ?}

?? ??? ??? ? });

?? ??? ??? ?

?? ??? ?};

?? ??? ?

?? ??? ?//在BrderLayout布局SOUTH添加选择颜色按钮

?? ??? ?JLabel label =new JLabel("选择画笔(橡皮)颜色");

?? ??? ?label.setFont(f);

?? ??? ?colorPanel.add(label);

?? ??? ?

?? ??? ? //添加颜色按钮

?? ??? ?Color[] colorArray = { Color.BLUE, Color.GREEN, Color.RED,?

? ? ? ? ? ? ? ? Color.BLACK,Color.ORANGE,Color.PINK,Color.CYAN,

? ? ? ? ? ? ? ? Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,

? ? ? ? ? ? ? ? Color.LIGHT_GRAY,Color.YELLOW,Color.WHITE};

?? ??? ?

?? ??? ?//在布局管理器中添加颜色按钮

? ? ? ? for( int i=0;i<colorArray.length;i++) {

?? ??? ??? ?

? ? ? ? ?? ?JButton button = new JButton();

? ? ? ? ? ? button.setBackground(colorArray[i]);

? ? ? ? ? ? button.setPreferredSize(new Dimension(50, 50));

? ? ? ? ? ? button.addActionListener(dl);

? ? ? ? ? ? colorPanel.add(button);

? ? ? ? ? ? //获取当前状态的画笔颜色

? ? ? ? ? ? button.addActionListener(new ActionListener(){

?? ??? ??? ??? ?@Override

?? ??? ??? ??? ?public void actionPerformed(ActionEvent e) {

?? ??? ??? ??? ??? ?nowColor.setBackground(button.getBackground()); ?//在当前画笔颜色按钮加入选择的按钮颜色

?? ??? ??? ??? ?}

?? ??? ??? ? });

?? ??? ?};

?? ??? ?

?? ? ?funcPanel.setBackground(Color.gray);

?? ? ?

?? ? ?//添加背景主板颜色按钮,并设置监听器(背景颜色为按钮颜色)

?? ? ?JLabel label1=new JLabel("选择背景颜色");

?? ? ?label1.setFont(f);

?? ? ? backgroundPanel.add(label1);

?? ? ?Color[] backgroundArray= { Color.GREEN, Color.RED,

? ? ? ? ? Color.ORANGE,Color.PINK,Color.CYAN,

? ? ? ? ? ? ? Color.MAGENTA,Color.DARK_GRAY,Color.GRAY,

? ? ? ? ? ? ? Color.LIGHT_GRAY,Color.YELLOW,Color.WHITE,Color.BLACK};

?? ? ?//将按钮加入进去

?? ? ?for( int i=0;i<backgroundArray.length;i++) {

?? ??? ??? ?

? ? ? ?? ?JButton button = new JButton();

? ? ? ? ? button.setBackground(backgroundArray[i]);

? ? ? ? ? button.setPreferredSize(new Dimension(50, 50));

? ? ? ? ? backgroundPanel.add(button);

? ? ? ? ? //添加监听器,按下按钮改变背景颜色,同时体现当前状态

?? ??? ?button.addActionListener(new ActionListener(){

?? ??? ??? ?@Override

?? ??? ??? ?public void actionPerformed(ActionEvent arg0) {

?? ??? ??? ??? ?drawPanel.setBackground(button.getBackground()); //将背景颜色改为选取的背景颜色

?? ??? ??? ??? ?color1=button.getBackground();

?? ??? ??? ??? ?dl.background=color1; ?//将背景颜色传给DrawListener中的变量

?? ??? ??? ? ? ?System.out.println(color1);

?? ??? ??? ??? ?g.setColor(color1);

?? ??? ??? ??? ?g.fillRect(0, 0, 1300,800); ?//图片画笔填充背景颜色

?? ??? ??? ??? ?nowbackgroundColor.setBackground(button.getBackground());

?? ??? ??? ?}

?? ??? ? });

?? ??? ?};

?? ??? ?

?? ??? ?//添加选择画笔粗细的按钮,可选择画笔的粗细

?? ??? ?JLabel label5=new JLabel("选择画笔粗细");

?? ??? ? ?label5.setFont(f);

?? ??? ? ? backgroundPanel.add(label5);

?? ??? ? ? String[] Size={"细","中","粗"};

?? ??? ? ? //选择画笔模式的按钮

?? ??? ? ? for(int i=0;i<3;i++){

?? ??? ??? ? ? JButton graphsize=new JButton(Size[i]);

?? ??? ??? ? ? graphsize.setFont(new Font("宋体", Font.BOLD, 15));

?? ??? ??? ? ? graphsize.setBackground(Color.WHITE);

?? ??? ? ? ? ? graphsize.setPreferredSize(new Dimension(50, 50));

?? ??? ? ? ? ? backgroundPanel.add(graphsize);

? ? ? ? ? ? ? ?graphsize.addActionListener(dl);

? ? ? ? ? ? ? ?graphsize.addActionListener(new ActionListener(){

? ? ? ??? ??? ??? ?@Override

? ? ? ??? ??? ??? ?//获取当前画笔粗细

? ? ? ??? ??? ??? ?public void actionPerformed(ActionEvent e) {

? ? ? ??? ??? ??? ??? ?text1.setText(graphsize.getText()); //获取当前画笔模式

? ? ? ??? ??? ??? ?}

? ? ? ??? ??? ? });

?? ??? ? ? }

?? ??? ?jf.setVisible(true);

?? ??? ?// 获取这个界面的graphics属性, 画笔 g

?? ??? ?//Graphics2D g = (Graphics2D) drawPanel.getGraphics();

?? ??? ?//drawPanel.paintComponent(g);

?? ??? ? Graphics2D g1= (Graphics2D) drawPanel.getGraphics();

?? ??? ?

?? ??? ?//为画笔添加监听器

?? ??? ?drawPanel.addMouseListener(dl);

?? ??? ?dl.g = ?g1;// 右传左?

?? ??? ?dl.g3 = g;// 右传左

?? ??? ?

?? ?}

}

2、DrawListner类,画板功能监听器

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

package Java课程设计;

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Container;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.RenderingHints;

import java.awt.Shape;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseMotionListener;

import java.awt.geom.AffineTransform;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JTextField;

import java.awt.Color;

import java.util.ArrayList;

import java.util.Random;

import Java课程设计.Drawpad;

public class DrawListener implements MouseListener,ActionListener,MouseMotionListener {

?? ?//获取画笔

?? ?Graphics2D g;

?? ?//获取在保存图片上的画笔

?? ??? ?Graphics2D g3;

?? ?//获取按钮内容

?? ?String btnstr;

?? ?Color background=Color.white; //背景颜色默认为白色

?? ?Color graphcolor=Color.BLACK; //画笔颜色默认为黑色

?? ?JButton btn;

?? ?int x1, y1, x2, y2;// 声明坐标变量?

?? ?int x3=400;

?? ?int y3=0;

?? ?int graphsize=3;//默认为中等画笔

?? ?String btncontent="画笔"; //默认画笔模式为画笔

?? ?String content; ?//获取文字中的文字内容

?? ?String mode="方正仿宋简体"; ?//文字样式默认为“方正仿宋简体”

?? ?String size="20";

?? ?

?? ?//九宫格递归方法,画出九宫格

?? ?public void dg(int x,int y,int width,int height) {

?? ??? ?//九宫格函数,九宫格的实现

?? ??? ? if(width<3) {

?? ??? ??? ??? ?return;

?? ??? ??? ? ? ?}

?? ??? ?if(width>90) {

?? ??? ?g.fillRect(x+width/3, y+height/3, width/3, height/3);

?? ??? ?g3.fillRect(x+width/3, y+height/3, width/3, height/3);

?? ??? ?dg(x, y, width/3, height/3);

?? ??? ?dg(x+width/3, y, width/3, height/3);

?? ??? ?dg(x+(width/3)*2, y, width/3, height/3);

?? ??? ?dg(x, y+height/3, width/3, height/3);

?? ??? ?dg(x, y+(height/3)*2, width/3, height/3);

?? ??? ?

?? ??? ?dg(x+width/3, y+height/3, width/3, height/3);

?? ??? ?dg(x+width/3, y+(height/3)*2, width/3, height/3);

?? ??? ?

?? ??? ?dg(x+(width/3)*2, y+height/3, width/3, height/3);

?? ??? ?dg(x+(width/3)*2, y+(height/3)*2, width/3, height/3);

?? ??? ?

?? ??? ?}

?? ? ?//九宫格的实现

?? ? ? else {

?? ??? ? ? g.drawOval(x+width/3, y+height/3, width/3, height/3);

?? ??? ? ? g3.drawOval(x+width/3, y+height/3, width/3, height/3);

?? ??? ? ? dg(x, y, width/3, height/3);

?? ??? ? ? dg(x+width/3, y, width/3, height/3);

?? ??? ??? ?dg(x+(width/3)*2, y, width/3, height/3);

?? ??? ??? ?dg(x, y+height/3, width/3, height/3);

?? ??? ??? ?dg(x, y+(height/3)*2, width/3, height/3);

?? ??? ??? ?

?? ??? ??? ?dg(x+width/3, y+height/3, width/3, height/3);

?? ??? ??? ?dg(x+width/3, y+(height/3)*2, width/3, height/3);

?? ??? ??? ?

?? ??? ??? ?dg(x+(width/3)*2, y+height/3, width/3, height/3);

?? ??? ??? ?dg(x+(width/3)*2, y+(height/3)*2, width/3, height/3);

?? ? ? }?? ?

?? ?

?? ?}

?? ?//判断是颜色按钮还是画笔按钮,改变的全部是画笔按钮

?? ?public void actionPerformed(ActionEvent e) {

?? ??? ?btnstr=e.getActionCommand(); ?//获取按钮的文字内容

?? ??? ?//g.setColor(Color.black);

?? ??? ?//如果为颜色按钮,将画笔改颜色

?? ??? ?if(btnstr.equals("清除")){

?? ??? ??? ?//重新填充背景,同时将画笔置为背景颜色

?? ??? ??? ? System.out.println(background);

?? ??? ??? ?g.setColor(background);//保存图片画笔填充背景颜色

?? ? ? ??? ?g.fillRect(0, 0, 1300, 800);

?? ? ? ??? ?g3.setColor(background);//画笔重新填充背景

?? ? ? ??? ?g3.fillRect(0, 0, 1300, 800);

?? ? ? ??? ?g.setColor(graphcolor);

?? ? ? ??? ?g3.setColor(graphcolor);

?? ??? ?}

?? ??? ?else{

?? ??? ?if(btnstr.equals("")) {

?? ??? ??? ?//获取点击内容,将其内容强制转换成JButton

?? ??? ? ? btn=(JButton) e.getSource();

?? ??? ??? ?//获取颜色按钮颜色

?? ??? ? ? graphcolor=btn.getBackground();

?? ??? ??? ?

?? ??? ?}

?? ??? ?//若为画笔粗细,获取粗细大小

?? ??? ?else if(btnstr.equals("细")){

?? ??? ??? ?graphsize=1; ?//画笔大小为细,大小size为1

?? ??? ?}

?? ??? ?else if(btnstr.equals("中")){

?? ??? ??? ?graphsize=3;

?? ??? ?}

?? ??? ?else if(btnstr.equals("粗")){

?? ??? ??? ?graphsize=5;

?? ??? ?}

?? ??? ?else{

?? ??? ??? ?btncontent=btnstr; //获取画笔模式按钮的内容

?? ??? ?}

?? ??? ?}

?? ?}

?? ?//鼠标点击方法

?? ?@Override

?? ?public void mouseClicked(MouseEvent e) {

?? ??? ?System.out.println("点击");

?? ?}

? ?//鼠标按下方法

?? ?@Override

?? ?public void mousePressed(MouseEvent e) {

?? ??? ?System.out.println("按下");

?? ??? ?x1=e.getX();

?? ??? ?y1 =e.getY();

?? ?}

? ? //重写鼠标释放时的方法

?? ?@Override

?? ?public void mouseReleased(MouseEvent e) {

?? ??? ?g.setColor(graphcolor);//获取保存画笔的颜色

?? ??? ?g3.setColor(graphcolor); //获取画板画笔的颜色

?? ??? ?

?? ??? ?x2=e.getX();

?? ??? ?y2 =e.getY();

?? ??? ?//选取画笔模式为直线时

?? ??? ?if(btncontent.equals("直线")) {

?? ??? ??? ?g.setStroke(new BasicStroke(graphsize)); //保存画笔进行画图

?? ??? ?g.drawLine(x1, y1, x2, y2);//画笔画直线

?? ??? ?g3.setStroke(new BasicStroke(graphsize));//置画笔大小

?? ??? ?g3.drawLine(x1, y1, x2, y2);

?? ??? ?}

?? ??? ?//选取画笔模式为波形时

?? ??? ?else if(btncontent.equals("波形")) {

?? ??? ??? ?//波形函数

?? ??? ??? ?g.setStroke(new BasicStroke(graphsize)); //置画笔大小

?? ??? ??? ?g3.setStroke(new BasicStroke(graphsize));

?? ??? ??? ?double x4 = 0,y4 = 0;

?? ??? ??? ?double a2=1.40,b2=1.56,c2=1.40,d2=-6.56;

?? ??? ??? ?//波形函数

?? ??? ??? ?for(int i=0;i<5000;i++) {

?? ??? ??? ??? ?double x5=Math.sin(a2*x4)-Math.cos(b2*y4);

?? ??? ??? ??? ?double y5=Math.sin(c2*x4)-Math.cos(d2*y4);

?? ??? ??? ??? ?x4=x5;

?? ??? ??? ??? ?y4=y5;

?? ??? ??? ??? ?int px=(int)(x5*100+x1);

?? ??? ??? ??? ?int py=(int)(y5*100+y1);

?? ??? ??? ??? ?//画波形

?? ??? ??? ??? ?g.drawLine(px, py, px, py);

?? ??? ??? ??? ?g3.drawLine(px, py, px, py);

?? ??? ??? ??? ?}

?? ??? ?}

?? ??? ?//选取画笔模式为矩形时

?? ??? ?else if(btncontent.equals("矩形")) {

?? ??? ??? ?g.setStroke(new BasicStroke(graphsize)); //获取矩形画笔的大小

?? ??? ??? ?g.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));//画矩形

?? ??? ??? ?g3.setStroke(new BasicStroke(graphsize));?

?? ??? ??? ?g3.drawRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));

?? ??? ?}

?? ??? ?//选取的画笔模式为填充矩形

?? ??? ?else if(btncontent.equals("填充矩形")){

?? ??? ??? ?//画填充矩形

?? ??? ??? ?g.fillRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));

?? ??? ??? ?g3.fillRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));

?? ??? ?}

?? ??? ?//长方体函数

?? ??? ?else if(btncontent.equals("长方体")){

?? ??? ??? ?g.setStroke(new BasicStroke(graphsize));//获取长方体画笔大小

?? ??? ??? ? g.setColor(btn.getBackground());//将画笔颜色置选择画笔颜色按钮颜色

?? ??? ??? ? //长方体函数

?? ? ? ? ? ? ? ?g.fillRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));

?? ? ? ? ? ? ? ?g3.setStroke(new BasicStroke(graphsize));

?? ??? ??? ??? ? g3.setColor(btn.getBackground());

?? ??? ? ? ? ? ? ? ?g3.fillRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));

?? ? ? ? ? ? ? ?int a,b,c,d;

?? ? ? ? ? ? ? ?a=Math.min(x1, x2);

?? ? ? ? ? ? ? ?b=Math.max(x1, x2);

?? ? ? ? ? ? ? ?c=Math.min(y1, y2);

?? ? ? ? ? ? ? ?d=Math.max(y1, y2);

?? ? ? ? ? ? ? ?int m=(int)((b-a)*Math.cos(Math.PI/4)*Math.sin(Math.PI/4));

?? ? ? ? ? ? ? ?int n=(int)((b-a)*Math.cos(Math.PI/4)*Math.sin(Math.PI/4));

?? ? ? ? ? ? ? ?//顶面

?? ? ? ? ? ? ? ?g.setColor(btn.getBackground());

?? ? ? ? ? ? ? ?g.fillPolygon(new int[] {a, a+m, b+m,b},new int[] {c,c-n,c-n,c},4);

?? ? ? ? ? ? ? ?//右侧面

?? ? ? ? ? ? ? ?g.setColor(btn.getBackground());

?? ? ? ? ? ? ? ?g.fillPolygon(new int[] {b, b, b+m,b+m},new int[] {c,d,d-n,c-n},4);

?? ? ? ? ? ? ? ?g3.setColor(btn.getBackground());

?? ? ? ? ? ? ? ?g3.fillPolygon(new int[] {a, a+m, b+m,b},new int[] {c,c-n,c-n,c},4);

?? ? ? ? ? ? ? ?//右侧面

?? ? ? ? ? ? ? ?g3.setColor(btn.getBackground());

?? ? ? ? ? ? ? ?g3.fillPolygon(new int[] {b, b, b+m,b+m},new int[] {c,d,d-n,c-n},4);

?? ??? ?}

?? ??? ?//分形函数

?? ??? ?else if(btncontent.equals("分形")){

?? ??? ??? ?g.setStroke(new BasicStroke(graphsize)); ?//获取画笔大小

?? ??? ??? ?g3.setStroke(new BasicStroke(graphsize));

?? ??? ??? ?double x = 0,y = 0;

?? ??? ??? ?//分形函数实现

?? ??? ??? ?double a1=-1.8,b=-2.0,c=-0.5,d=-0.9;

?? ??? ??? ?for(int i=0;i<5000;i++) {

?? ??? ??? ?double x3=Math.sin(a1*y)-c*Math.cos(a1*x);

?? ??? ??? ?double y3=Math.sin(b*x)-d*Math.cos(b*y);

?? ??? ??? ?x=x3;

?? ??? ??? ?y=y3;

?? ??? ??? ?int px=(int)(x3*100+x1);

?? ??? ??? ?int py=(int)(y3*100+y1);

?? ??? ??? ?g.drawLine(px, py, px, py);

?? ??? ??? ?g3.drawLine(px, py, px, py);

?? ??? ?}

?? ??? ?}

?? ??? ?//画圆

?? ? ? ?else if(btncontent.equals("圆")) {

?? ? ? ??? ?g.setStroke(new BasicStroke(graphsize));//获取画笔大小

?? ??? ??? ?g.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));//画圆

?? ??? ??? ?g3.setStroke(new BasicStroke(graphsize));

?? ??? ??? ?g3.drawOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));

?? ??? ?}

?? ??? ?//画填充圆

?? ? ? ?else if(btncontent.equals("填充圆")){

?? ? ? ??? ?g.fillOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));//画填充圆

?? ? ? ??? ?g3.fillOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2-x1), Math.abs(y2-y1));

?? ? ? ?}

?? ??? ?//当选取模式为文字

?? ? ? ?else if(btncontent.equals("文字")){

?? ? ? ??? ?//获取画笔大小

?? ? ? ??? ?g.setStroke(new BasicStroke(15));

? ? ? ? Font font = new Font(mode, Font.BOLD, Integer.parseInt(size)); //获得文字内容,文字大小,文字样式 ? ?

? ? ? ? ?g.setFont(font); //在画笔中置文字样式和大小

?? ? ? ??? ?g.drawString(content, x1, y1); //写上文字内容

?? ? ? ??? ?g3.setStroke(new BasicStroke(15));

?? ? ? ??? ? g3.setFont(font);//放入文字样式和大小

?? ? ? ??? ?g3.drawString(content, x1, y1);

?? ? ? ?}

?? ??? ?//当画笔模式为弧线时

?? ? ? ?else if(btncontent.equals("弧线")){

?? ? ? ??? ?g.setStroke(new BasicStroke(graphsize));//获取画笔大小

?? ? ? ??? ?//弧线函数

?? ??? ??? ? g.drawArc(x1, y1, 100, 60, 0, 180);

?? ??? ??? ? g3.setStroke(new BasicStroke(graphsize));

?? ??? ??? ? g3.drawArc(x1, y1, 100, 60, 0, 180);

?? ? ? ?}

?? ??? ?//九宫格递归,调用九宫格函数

?? ? ? ?else if(btncontent.equals("九宫格递归")) {

?? ? ? ??? ?//九宫格递归实现

?? ? ? ??? ? ?dg(0,50,600,600);

?? ? ? ? ?}

?? ??? ?System.out.println("释放");

?? ??? ?

?? ?}

?? ?@Override

?? ?//鼠标进入方法

?? ?public void mouseEntered(MouseEvent e) {

?? ??? ?System.out.println("进入");

?? ?}

?? ?@Override

?? ?//鼠标离开界面方法

?? ?public void mouseExited(MouseEvent e) {

?? ??? ?System.out.println("离开");

?? ?}

?? ?@Override

?? ?public void mouseMoved(MouseEvent e) {

?? ??? ?

?? ?}

?? ?//重写鼠标移动函数

?? ?@Override

?? ?public void mouseDragged(MouseEvent e) {

?? ??? ?g.setColor(graphcolor); //获取画笔颜色

?? ??? ?g3.setColor(graphcolor);

?? ??? ?// TODO Auto-generated method stub

?? ??? ?x2=e.getX();

?? ??? ?y2 =e.getY();

?? ??? ?//当为画笔时

?? ??? ?if(btncontent.equals("画笔")){

?? ??? ??? ?

?? ??? ?g.setStroke(new BasicStroke(graphsize));?? ?//获取当前画笔大小?? ??? ?

?? ??? ?//画笔实现

?? ??? ??? ??? ?g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

?? ??? ??? ??? ?g.drawLine(x1, y1, x2, y2);

?? ??? ??? ??? ?g3.setStroke(new BasicStroke(graphsize));?? ??? ??? ?

?? ??? ??? ??? ?g3.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

?? ??? ??? ??? ?g3.drawLine(x1, y1, x2, y2);

?? ??? ??? ??? ?x1 = x2;

?? ??? ??? ??? ?y1 = y2;

?? ??? ??? ??? ?}

?? ??? ?//橡皮擦

?? ??? ? if(btncontent.equals("橡皮")){

?? ??? ??? ? //将画笔颜色置为背景颜色

?? ??? ??? ? g.setColor(background);

?? ??? ??? ? g3.setColor(background);

?? ??? ??? ?g.setStroke(new BasicStroke(30));?? ?//将橡皮擦的大小置大小为30?? ??? ??? ??? ??? ??? ?

?? ??? ??? ?g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

?? ??? ??? ?g.drawLine(x1, y1, x2, y2);

?? ??? ??? ?

?? ??? ??? ?g3.setStroke(new BasicStroke(30));?? ??? ??? ??? ??? ??? ??? ?

?? ??? ??? ?g3.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

?? ??? ??? ?g3.drawLine(x1, y1, x2, y2);

?? ??? ??? ?x1 = x2;

?? ??? ??? ?y1 = y2; ??

?? ??? ??? ?//使用过后,将画笔颜色重新置为原来颜色

?? ??? ??? ?g.setColor(graphcolor);

?? ??? ??? ?g3.setColor(graphcolor);

?? ? ? ?}

?? ??? ? //喷枪函数

?? ??? ??

?? ? ? ?else if(btncontent.equals("喷枪")){

?? ??? ??? ??? ?g.setStroke(new BasicStroke(graphsize));?? ? ?//不用加粗,获取画笔大小?? ??? ??? ??? ??? ??? ?

?? ??? ??? ??? ?g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

?? ??? ??? ??? ?g3.setStroke(new BasicStroke(graphsize));?? ? ?//不用加粗?? ??? ??? ??? ??? ??? ?

?? ??? ??? ??? ?g3.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

?? ??? ??? ??? ?//喷枪实现函数

?? ??? ??? ??? ?for(int k=0;k<20;k++){

?? ??? ??? ??? ??? ?Random i=new Random(); ? ? ??

?? ??? ??? ??? ??? ?int a=i.nextInt(10);

?? ??? ??? ??? ??? ?int b=i.nextInt(20);

?? ??? ??? ??? ??? ?g.drawLine(x2+a, y2+b, x2+a, y2+b);

?? ??? ??? ??? ??? ?g3.drawLine(x2+a, y2+b, x2+a, y2+b);

?? ? ? ?}

?? ? ? ?}

?? ??? ?

?? ?}

}

画板演示:

保存图片:

 

相关文章:

Java实现简单小画板

Java制作简单画板&#xff0c;包括两个类&#xff0c;一个主要画板类Drawpad&#xff0c;一个画板监听器DrawListener类。 1、Drawpad类&#xff0c;包括画板&#xff0c;画板功能设计&#xff0c;保存图片等 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2…...

B078-项目实战--支付模块 领养订单支付流程

目录 支付模块需求分析表设计支付单表支付宝账号信息表-商家账号微信支付账号信息表-商家账号银行账号表-商家资金账号表支付流水表 流程分析支付基础模块继承加密算法沙箱环境准备支付宝支付-流程分析根据demo封装工具类导入依赖AlipayConfigAlipayInfoAlipayUtil 内网穿透 领…...

[css]margin-top不起作用问题(外边距合并)

在初学css时&#xff0c;会遇到突然间margin-top不起作用的情况。如下面&#xff1a; 情况一&#xff1a; 代码&#xff1a; <html> <head><style type"text/css"> * {margin:0;padding:0;border:0; }#outer {width:300px;height:300px;backgroun…...

Vue2基础八、插槽

零、文章目录 Vue2基础八、插槽 1、插槽 &#xff08;1&#xff09;默认插槽 作用&#xff1a;让组件内部的一些 结构 支持 自定义需求: 将需要多次显示的对话框, 封装成一个组件问题&#xff1a;组件的内容部分&#xff0c;不希望写死&#xff0c;希望能使用的时候自定义。…...

自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:连接到特征存储]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 特征存储是传统机器学习中的一个概念&#xff0c;它确保输入模型的数据是最新和相关的。在考虑将LLM应用程序投入生产时&#xff0c;这个概念非常重要。为了个性化LLM应用程序&#xff0c;我们可能希望将LLM与特定用户…...

jenkins自定义邮件发送人姓名

jenkins发送邮件的时候发送人姓名默认的&#xff0c;如果要自定义发件人姓名&#xff0c;只需要修改如下信息即可&#xff1a; 系统管理-system-Jenkins Location下的系统管理员邮件地址 格式为&#xff1a;自定义姓名<邮件地址>...

SolidWorks二次开发---简单的连接solidworks

创建一个.net Framework的应用&#xff0c;正常4.0以上就可以了。 打开nuget包管理 在里面搜索paine 在版中选择对应的solidworks年份开头的&#xff0c;进行安装。 安装完之后 : 同时选中下面两个dll,把嵌入操作类型改为false 然后在按钮的单击事件中输入: Connect.Crea…...

docker 安装 active Mq

在安装完Docker的机器上&#xff0c;安装activeMQ。 拉取镜像&#xff1a; docker pull webcenter/activemq 查看镜像&#xff1a; docker images Docker运行ActiveMQ镜像 docker run --name activemq -d -p 8161:8161 -p 61616:61616 --privilegedtrue --restartalways …...

【Linux】TCP协议

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;TCP协议&…...

DevOps系列文章之 自动化测试大全(单测和集成测试)

自动化测试业界主流工具 核心目标&#xff1a; 主要是功能测试和覆盖率测试 业界常用主流工具 GoogleTest GoogleTest是一个跨平台的(Liunx、Mac OS X、Windows 、Cygwin 、Windows CE and Symbian ) C单元测试框架&#xff0c;由google公司发布&#xff0c;为在不同平台上为编…...

Android启动速度优化

本节主要内容&#xff1a;了解APP启动流程、启动状态、查看启动时间、CPU Profile定位启动耗时代码、StrictMode严苛模式检测不合理写法、解决启动黑白屏问题。 一、APP启动流程 ①用户点击桌面App图标&#xff0c;Launcher进程采用Binder IPC向system_server进程发起startAc…...

linux 日志 系统安全日志 web日志

web日志 LINUX日志系统之WEB日志&#xff08;一&#xff09;_dracut.log_麻子来了的博客-CSDN博客 系统安全日志 Linux系统安全日志详解_sinolover的博客-CSDN博客 wtmp和utmp文件都是二进制文件&#xff0c;需使用who、w、users、last和ac来操作这两个文件。 who /var/lo…...

SpringBoot 整合 MongoDB 连接 阿里云MongoDB

注&#xff1a;spring-boot-starter-data-mongodb 2.7.5&#xff1b;jdk 1.8 阿里云MongoDB是副本集实例的 在网上查找了一番&#xff0c;大多数都是教连接本地mongodb或者linux上的mongodb 阿里云上有java版连接教程&#xff0c;但它不是SpringBoot方法配置的&#xff0c;是手…...

Debeizum 增量快照

在Debeizum1.6版本发布之后&#xff0c;成功推出了Incremental Snapshot&#xff08;增量快照&#xff09;的功能&#xff0c;同时取代了原有的实验性的Parallel Snapshot&#xff08;并行快照&#xff09;。在本篇博客中&#xff0c;我将介绍全新快照方式的原理&#xff0c;以…...

windows下安装composer

安装Php 教程 下载composer 官网 中文网站 exe下载地址 下载好exe 双击运行 找到php.ini注释一行代码 测试 composer -v说明安装成功 修改源 执行以下命令即可修改 composer config -g repo.packagist composer https://packagist.phpcomposer.com # 查看配置…...

企业游学进华秋,助力电子产业创新与发展

近日&#xff0c;淘IC企业游学活动&#xff0c;携20多位电子行业的企业家&#xff0c;走进了深圳华秋电子有限公司&#xff08;以下简称“华秋”&#xff09;&#xff0c;进行交流学习、供需对接。华秋董事长兼CEO陈遂佰对华秋的发展历程、业务版块、产业布局等做了详尽的介绍&…...

玩转Tomcat:从安装到部署

文章目录 一、什么是 Tomcat二、Tomcat 的安装与使用2.1 下载安装2.2 目录结构2.3 启动 Tomcat 三、部署程序到 Tomcat3.1 Windows环境3.2 Linux环境 一、什么是 Tomcat 一看到 Tomcat&#xff0c;我们一般会想到什么&#xff1f;没错&#xff0c;就是他&#xff0c;童年的回忆…...

吃透《西瓜书》第四章 决策树定义与构造、ID3决策树、C4.5决策树、CART决策树

目录 一、基本概念 1.1 什么是信息熵&#xff1f; 1.2 决策树的定义与构造 二、决策树算法 2.1 ID3 决策树 2.2 C4.5 决策树 2.3 CART 决策树 一、基本概念 1.1 什么是信息熵&#xff1f; 信息熵: 熵是度量样本集合纯度最常用的一种指标&#xff0c;代表一个系统中蕴…...

复现宏景eHR存在任意文件上传漏洞(0day)

目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现 一、漏洞描述 北京宏景世纪软件股份有限公司(简称“宏景软件”)自成立以来始终专注于国有企事业单位人力与人才管理数智化(数字化、智能化)产品的研发和应用推广,是中国国有企事业单位人力与人才管理数智…...

unity连接MySQL数据库并完成增删改查

数据存储量比较大时&#xff0c;我就需要将数据存储在数据库中方便使用&#xff0c;尤其是制作管理系统时&#xff0c;它的用处就更大了。 在编写程序前&#xff0c;需要在Assets文件夹中创建plugins文件&#xff0c;将.dll文件导入&#xff0c;文件从百度网盘自取&#xff1a;…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...