会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132808个问题
Python 全系列/第一阶段:Python入门/面向对象 31921楼
JAVA 全系列/第九阶段:Spring Boot实战/Spring Boot 31923楼

老师,我按照高老师的代码操作的,但是不知道为什么,就标红了,希望老师解答一下

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * 游戏主窗口
 */
public class MyGameFrame extends Frame {


    Image planeImg = GameUtil.getImage("images/plane.png");
    Image bg = GameUtil.getImage("images/bg.jpg");


    plane p1 = new plane(planeImg, 100, 100, 3);

    boolean left, right, up, down;   // 飞机的方向控制


    @Override
    public void paint(Graphics g) {      //g当做一支画笔

        g.drawImage(bg, 0, 0, 500, 500, null);

        p1.drawMyself(g);

        if (left) {
            p1.x -= p1.speed;
        }
        if (right) {
            p1.x += p1.speed;
        }
        if (up) {
            p1.y -= p1.speed;
        }
        if (down) {
            p1.y += p1.speed;
        }

    }

    //初始化窗口
    public void launchFrame() {                     //定义方法
        this.setTitle("飞机大战.尚学堂");
        setVisible(true);    //窗口是否可见

        setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);    //窗口大小

        setLocation(100, 100);   //窗口打开的位置

        //增加关闭窗口的动作
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);     //正常退出程序
            }
        });

        new PaintThread().start();  //启动重画窗口的线程
        this.addKeyListener(new KeyMonitor());       // 启动键盘监听

    }

    /**
     * 定义了一个重要窗口的线程类
     * 定义成内部类是为了方便直接使用窗口类的相关方法
     */
    class PaintThread extends Thread {
        @Override
        public void run() {
            while (true) {
                repaint();    //内部类可以直接使用外部类的成员

                try {
                    Thread.sleep(50);     //1s=1000ms,1s画20次(20*50=1000)
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //内部类,实现键盘的监听处理
    class KeyMonitor extends KeyAdapter {

        @Override
        public void keyPressed(KeyEvent e) {
          /**  System.out.println("按下:" + e.getKeyCode());
            if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                left = true;
            }
            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                right = true;
            }
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                up = true;
            }
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                down = true;
            }*/
          switch (e.getKeyCode()){
              case KeyEvent.VK_LEFT:
                  left = true;
                  break;
              case KeyEvent.VK_RIGHT:
                  right = true;
                  break;
              case KeyEvent.VK_UP:
                  up = true;
                  break;
              case KeyEvent.VK_DOWN:
                  down = true;
                  break;

          }
        }

        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("抬起:" + e.getKeyCode());
            if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                left = false;
            }
            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                right = false;
            }
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                up = false;
            }
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                down = false;
            }


        }

        private Image offScreenImage = null;

        public void update(Graphics g) {
            if (offScreenImage == null)
                offScreenImage = this.createImage(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);

            Graphics gOff = offScreenImage.getGraphics();
            paint(gOff);
            g.drawImage(offScreenImage, 0, 0, null);

        }

        public static void main(String[] args) {
            MyGameFrame gameFrame = new MyGameFrame();
            gameFrame.launchFrame();
        }
    }
}

最后的main方法里,static标红,以及上面public void update(Graphics g)里面,creatImage也标红。

按照高老师的视频,有返回去学了两节,也不知道哪里出错了

JAVA 全系列/第一阶段:JAVA 快速入门/飞机大战小项目训练 31926楼
JAVA 全系列/第一阶段:JAVA 快速入门/面向对象详解和JVM底层内存分析 31927楼
Python 全系列/第五阶段:数据库编程/mysql的使用 31928楼

老师怎么join方法视频里的和图片上说的不一样呢?

image.png

这里是调用这个方法的线程强制执行完之前其他线程处于阻塞状态

但是视频里是说:导致调用join的线程陷入阻塞状态,不影响其他线程的运行

image.png

然后我自己的代码结果是这样的:

package com.bjsxt.mythread;
public class ThreadJoin implements Runnable{

    @Override
    public void run() {
        for (int i=0;i<10;i++){
            System.out.println("--->TreadJoin线程"+Thread.currentThread().getName()+"---"+i);
        }
    }
}


package com.bjsxt.mythread;
//创建测试类进行测试演示同时此类也是主线程
public class TestThreadJoin {


    public static void main(String[] args) throws InterruptedException {
        //主线程
        ThreadJoin tj=new ThreadJoin();
        Thread t=new Thread(tj,"线程t");
        Thread t2=new Thread(tj,"线程t2");
        //启动线程
        t.start();
        t2.start();
        //以下代码为主线程中的循环
        for (int i=0;i<10;i++){
            //设置强制执行点
            if (i==3){
                t.join();//当这个线程执行到i=3的时候强制执行t线程
            }
            System.out.println("z主线程--->"+Thread.currentThread().getName()+"----->"+i);
        }

    }
}

运行结果是:在主线程循环里面t线程调用了jion方法,将主线程陷入了阻塞状态,t线程和t2线程抢占运行资源,运行完之后,主线程在运行

image.png


所以:到底对于调用join方法的定义到底是什么?以及视频里个人感觉调用join方法的是t线程而不是主线程,它最多只是t线程在主线程里调用了join方法

JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 31930楼

老师下面的代码两层for循环的逻辑不是十分理解。


为什么要做if(highlight.getField().getName().equals("item_title")) 然后进行searchPojo.setTitle(highlight.getSnipplets().get(0));?searchPojo本身没有item_title吗


另外field有item_title和item_sell_point, item_sell_point不管了?






// 高亮条件

        HighlightOptions hlOptions = new HighlightOptions();

        hlOptions.setSimplePrefix("<span style='color:red'>");

        hlOptions.setSimplePostfix("</span>");


        hlOptions.addField("item_title item_sell_point");

        query.setHighlightOptions(hlOptions);


        // 相当于可视化界面点击查询按钮得出的总体值

        HighlightPage<SearchPojo> hlPage = solrOperations.queryForHighlightPage("ego", query, SearchPojo.class);

        // 取出包含高亮的数据

        List<HighlightEntry<SearchPojo>> highlighted = hlPage.getHighlighted();


        // 创建一个集合,集合放所有查询到的数据,对应页面中

        List<SearchPojo> listResult = new ArrayList<>();


        for(HighlightEntry<SearchPojo> hlEntity : highlighted){

            // 非高亮数据,相当于可视化界面中docs

            SearchPojo searchPojo = hlEntity.getEntity();

            // 把从solr中取出的image转换为images

            String image = searchPojo.getImage();

            searchPojo.setImages(image!=null&&!image.equals("")?image.split(","):new String[1]);


            // 高亮数据,相当于可视化界面中highlighting

            List<HighlightEntry.Highlight> listHL = hlEntity.getHighlights();


            for(HighlightEntry.Highlight highlight : listHL){

                // 当前这个对象item_title包含高亮数据

                if(highlight.getField().getName().equals("item_title")){

                    // 替换普通数据

                    searchPojo.setTitle(highlight.getSnipplets().get(0));

                }

            }

            // 把处理完的包含高亮数据的对象放入到集合中

            listResult.add(searchPojo);

        }


JAVA 全系列/第十八阶段:亿级高并发电商项目_架构/编码(旧)/电商:使用Solr实现数据搜索 31933楼

netshop.zip

1592322475(1).jpg为什么我一用session就报这个错,在网上也没找到答案

Python 全系列/下架-第十二阶段:Python_大型电商项目(5天后下架)/Django项目阶段-电商项目(旧) 31934楼

记事本报错

# coding=utf-8
"""开发记事本软件的菜单"""
from tkinter import *
from tkinter.filedialog import *
from tkinter.colorchooser import *


class Application(Frame):

    def __init__(self,master=None):
        super().__init__(master)
        self.master = master
        self.textpad = None      # textpad 代表Text文本框对象
        self.pack()
        self.createWidget()
        self.filename = None     # 表示打开文本文件的名字
        self.contextMenu = None  # 上下文菜单对象

    def createWidget(self):
        # 创建主菜单栏
        menubar = Menu(root)

        # 添加快捷键事件处理
        root.bind("<Control-n>", lambda event: self.newfile())
        root.bind("<Control-o>", lambda event: self.openfile())
        root.bind("<Control-s>", lambda event: self.savefile())
        root.bind("<Control-q>", lambda event: self.exit())

        # 创建子菜单
        menuFile = Menu(menubar)
        menuEdit = Menu(menubar)
        menuHelp = Menu(menubar)

        # 将子菜单加入到主菜单栏
        menubar.add_cascade(label="文件(F)", menu=menuFile)
        menubar.add_cascade(label="编辑(E)", menu=menuEdit)
        menubar.add_cascade(label="帮助(H)", menu=menuHelp)

        # 添加菜单项
        menuFile.add_command(label="新建", accelerator="Ctrl+n", command=self.newfile)
        menuFile.add_command(label="打开", accelerator="Ctrl+o", command=self.openfile)
        menuFile.add_command(label="保存", accelerator="Ctrl+s", command=self.savefile)
        menuFile.add_separator()  # 添加分割线
        menuFile.add_command(label="退出", accelerator="Ctrl+q", command=self.exit)

        # 将主菜单栏添加到根窗口
        root["menu"] = menubar

        # 文本编辑区
        self.textpad = Text(root, width=50, height=30)
        self.textpad.pack()

        # 创建上下菜单
        self.contextMenu = Menu(root)
        self.contextMenu.add_command(label="背景颜色", command=self.openAskColor)

        # 为右键绑定事件
        root.bind("<Button-3>", self.createContextMenu)

    def openfile(self):
        self.textpad.delete("1.0", "end")  # 先把text控件中的内容清空
        with askopenfile(title="打开文件", initialdir="f:") as f:
            self.textpad.insert(INSERT, f.read())
            self.filename = f.name

    def savefile(self):
        with open(self.filename, "w") as f:
            c = self.textpad.get(1.0, END)
            f.write(c)

    def exit(self):
        root.quit()

    def newfile(self):
        self.textpad.delete(1.0, END)
        self.filename = asksaveasfile(title="另存为", initialfile="未命名",
                                      filetypes=[("文本文档", "*.txt")],
                                      defaultextension='.txt')
        self.savefile()

    def openAskColor(self):
        s1 = askcolor(color="red", title="选择背景颜色")
        self.textpad.config(bg=s1[1])

    def createContextMenu(self, event):
        # 菜单在鼠标右键单击的坐标处显示
        self.contextMenu.post(event.x_root, event.y_root)


if __name__ == '__main__':
    root = Tk()
    root.geometry("500x200+1000+300")
    app = Application(master=root)
    root.mainloop()

1.新建报错

image.png


2.右键报错

image.png

Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 31935楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637