Java 绘制未被调用的组件

Java 绘制未被调用的组件,java,swing,jframe,jpanel,paintcomponent,Java,Swing,Jframe,Jpanel,Paintcomponent,我正试图编写一个小的迷宫运行程序,但遇到了一些与paintComponent()相关的问题。我已经完成了调试,由于某种原因,我的paintComponent()从未被调用,即使我的计时器正在调用repaint() private void jpanelinit() { JPanel Background = new JPanel (new BorderLayout()); JPanel Menu = new JPanel (new BorderLa

我正试图编写一个小的迷宫运行程序,但遇到了一些与paintComponent()相关的问题。我已经完成了调试,由于某种原因,我的paintComponent()从未被调用,即使我的计时器正在调用repaint()

private void jpanelinit() {
        JPanel Background = new JPanel (new BorderLayout());        
        JPanel Menu = new JPanel (new BorderLayout());
        JPanel Maze = new JPanel (new GridLayout(arow, acolumn));
        Background.setPreferredSize(new Dimension(850,850));        
        Menu.setPreferredSize(new Dimension(850, 100));
        Maze.setPreferredSize(new Dimension(850,750));
        frame.add(Background);              
        comboboxinit();
        Background.add(Menu, BorderLayout.NORTH);                   
        Background.add(Maze, BorderLayout.SOUTH);
        Menu.add(Startpause, BorderLayout.WEST);                    
        Menu.add(Reset, BorderLayout.EAST);
        Menu.add(Intervalpick, BorderLayout.CENTER);
        Intervalpick.setVisible(true);                          
        Intervalpick.addActionListener(this);
        Startpause.setVisible(true);
        Startpause.addActionListener(this);
        Reset.setVisible(true);
        Reset.addActionListener(this);
        Maze.setVisible(true);

}
    private static void frameinit() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        frame.setResizable(false);
        frame.setSize(850,850);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }
这些是我的frame和jpanelinit方法

@Override 
public void paintComponent(Graphics g){
    System.out.println("Entered Graphics");
    super.paintComponent(g);
    g.drawImage(biWall,0,100,850,750, this );

}
这是我的paintComponent,图像确实已缓冲并已存储

    public void actionPerformed(ActionEvent e) {
    if(e.getSource()==Intervalpick)
        timecheck();        //Checks if the time was changed
    if(e.getSource()==Startpause||e.getSource()==Reset)
        buttoncheck(e);     //Checks if the buttons were pressed
    if(t.isRunning())
        mazeupdate();
     }

    private void mazeupdate() { 
    repaint();
    }
这是我的actionPerformed,它是用我的计时器调用的,默认设置为5秒的间隔

public class mazerunner extends JPanel implements ActionListener {


static JButton Startpause = new JButton("Start");
static JButton Reset = new JButton("Reset");
static JComboBox Intervalpick= new JComboBox();
static JFrame frame=new JFrame ("Maze Runner");
static int arow=0, acolumn=0, icurrenttime=5000;
static boolean gameplaying=false;
static Timer t;
static BufferedImage biWall, biFloor, biMouse, biCheese;

public static void main(String[] args) {

    mazerunner mr= new mazerunner();

    filereader();           //Reads the file
    imagebuffer();          //Buffers the images
    mr.jpanelinit();        //Inits the gui
    frameinit();            //Inits the frame
    mr.timerinit();         //Inits the timer

}

    private static void imagebuffer() {

        try{
            biWall=ImageIO.read(new File("cobblewall.jpg"));
        }
        catch(IOException e){}
        try{
            biFloor=ImageIO.read(new File("woodenfloor.jpg"));
        }
        catch(IOException e){}
        try{
            biCheese=ImageIO.read(new File("chest_cheese.jpg"));
        }
        catch(IOException e){}
        try{
            biMouse=ImageIO.read(new File("lara_mouse.jpg"));
        }
        catch(IOException e){}          

}

    private void  timerinit() {

        t=new Timer(icurrenttime,this);

}

    private void jpanelinit() {

        JPanel Background = new JPanel (new BorderLayout());        //Inits all the JPanels
        JPanel Menu = new JPanel (new BorderLayout());
        JPanel Maze = new JPanel (new GridLayout(arow, acolumn));

        Background.setPreferredSize(new Dimension(850,850));        //Sets the size of the panels
        Menu.setPreferredSize(new Dimension(850, 100));
        Maze.setPreferredSize(new Dimension(850,750));

        frame.add(Background);                                      //Adds background into the frame

        comboboxinit();

        Background.add(Menu, BorderLayout.NORTH);                   //Adds the other panels into the background
        Background.add(Maze, BorderLayout.SOUTH);

        Menu.add(Startpause, BorderLayout.WEST);                    //Adds the menu's components into the menu panel
        Menu.add(Reset, BorderLayout.EAST);
        Menu.add(Intervalpick, BorderLayout.CENTER);

        Intervalpick.setVisible(true);                              //Sets the components to visible and adds actionlistener
        Intervalpick.addActionListener(this);
        Startpause.setVisible(true);
        Startpause.addActionListener(this);
        Reset.setVisible(true);
        Reset.addActionListener(this);
        Maze.setVisible(true);

}

    private static void comboboxinit() {

        for(int a=5;a<=30;a=a+5){                                           //Sets the text inside the combobox
            Intervalpick.addItem(a+" Seconds");
        }
        DefaultListCellRenderer dlcr = new DefaultListCellRenderer();       //Centers the text inside the combobox
        dlcr.setHorizontalAlignment(DefaultListCellRenderer.CENTER); 
        Intervalpick.setRenderer(dlcr); 

    }

    private static void frameinit() {

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   //Inits the jframe
        frame.setResizable(false);
        frame.setSize(850,850);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);


    }

    private static void filereader() {

        try{
            FileReader fr=new FileReader("maze.txt");
            BufferedReader br= new BufferedReader(fr);
            String LineIn=br.readLine();
            int num, row=0;
            arow=Integer.parseInt(LineIn);
            LineIn=br.readLine();
            acolumn=Integer.parseInt(LineIn);
            int Maze[][]=new int[arow][acolumn];    //inits the maze itself
            LineIn=br.readLine();
            do{                                     //stores the maze from the file into the arrray
                int collumn=0;
                    StringTokenizer tokens=new StringTokenizer(LineIn);
                    while (tokens.hasMoreTokens()){
                        num=Integer.parseInt(tokens.nextToken());
                        Maze[row][collumn]=num;
                        collumn++;
                    }
                LineIn=br.readLine();
                row++;
            }while(LineIn!=null);
            br.close();
            fr.close();
        }   
        catch(FileNotFoundException e){
            System.err.println("file not found");
        }
        catch(IOException e){
            System.err.println("read failed");
        }

    }

@Override 
public void paintComponent(Graphics g){
    System.out.println("Entered Graphics");
    super.paintComponent(g);
    g.drawImage(biWall,0,100,850,750, this );

}

public void actionPerformed(ActionEvent e) {

    if(e.getSource()==Intervalpick)
        timecheck();        //Checks if the time was changed
    if(e.getSource()==Startpause||e.getSource()==Reset)
        buttoncheck(e);     //Checks if the buttons were pressed
    if(t.isRunning())
        mazeupdate();

}

    private void mazeupdate() {

        repaint();

}

    private void buttoncheck(ActionEvent e) {
        if(e.getSource()==Startpause){          //Starts and pauses the simulation
            if(gameplaying==false){
                gameplaying=true;
                t.start();
                Startpause.setText("Pause");
            }
            else if(gameplaying==true){
                gameplaying=false;
                t.stop();
                Startpause.setText("Start");
            }
        }
        else if(e.getSource()==Reset){              //Resets the maze to the original maze
            if(t.isRunning())
                t.stop();
            gameplaying=false;
            Startpause.setText("Start");
            filereader();
        //  t.repaint();
        }

}

    private void timecheck() {

    int boxtime= Integer.parseInt(((String) Intervalpick.getSelectedItem()).split(" ")[0])*1000;        //Turns Intervalpick into a milisecond amount
    if(boxtime!=icurrenttime){                  //Checks if the selected delay is equal to the actual delay
        boolean gamerunning=false;
        icurrenttime=boxtime;
        if(t.isRunning()){                      //Stops timer if running
            t.stop();
            gamerunning=true;
        }
        t.setDelay(icurrenttime);               //Changes delay
        if(gamerunning==true)                   //If timer was running it turns it back on
            t.start();
    }

}
公共类mazerunner扩展JPanel实现ActionListener{
静态按钮开始使用=新按钮(“开始”);
静态JButton Reset=新JButton(“Reset”);
静态JComboBox Intervalpick=newjcombobox();
静态JFrame=新JFrame(“迷宫跑步者”);
静态int arow=0,acolumn=0,iccurrentTime=5000;
静态布尔博弈=假;
静态定时器t;
静态缓冲图像双墙、双地板、双屋、双鞋;
公共静态void main(字符串[]args){
mazerunner mr=新mazerunner();
filereader();//读取文件
imagebuffer();//缓冲图像
jpanelinit先生();//初始化gui
frameinit();//初始化帧
timerinit先生();//初始化计时器
}
私有静态void imagebuffer(){
试一试{
biWall=ImageIO.read(新文件(“cobblewall.jpg”);
}
捕获(IOE){}
试一试{
biFloor=ImageIO.read(新文件(“woodenfloor.jpg”);
}
捕获(IOE){}
试一试{
biCheese=ImageIO.read(新文件(“cost_cheese.jpg”);
}
捕获(IOE){}
试一试{
biMouse=ImageIO.read(新文件(“lara_mouse.jpg”);
}
捕获(IOE){}
}
私有void timerinit(){
t=新计时器(icurrenttime,this);
}
私有无效JPanelinet(){
JPanel Background=newjpanel(newborderlayout());//初始化所有JPanel
JPanel菜单=新建JPanel(新建边框布局());
JPanel迷宫=新JPanel(新网格布局(arow,acolumn));
Background.setPreferredSize(新维度(850850));//设置面板的大小
Menu.setPreferredSize(新尺寸(850,100));
迷宫。设置首选尺寸(新尺寸(850750));
frame.add(Background);//将背景添加到帧中
comboboxinit();
Background.add(Menu,BorderLayout.NORTH);//将其他面板添加到背景中
背景。添加(迷宫,边界布局。南);
Menu.add(Startpause,BorderLayout.WEST);//将菜单的组件添加到菜单面板中
菜单。添加(重置,边界布局。东);
添加(间隔拾取、边界布局、中心);
Intervalpick.setVisible(true);//将组件设置为可见并添加actionlistener
Intervalpick.addActionListener(此);
Startpause.setVisible(true);
Startpause.addActionListener(此);
Reset.setVisible(真);
Reset.addActionListener(这个);
Maze.setVisible(true);
}
私有静态void comboxinit(){

for(int a=5;a
paintComponent
将不会被调用,原因有三个

  • 组件未连接到有效的本机对等方(即,它未直接或间接连接到屏幕上可见的窗口)
  • 或者它的大小不大于
    0x0
  • 或者它不可见
  • 浏览一下您的代码,我在任何地方都找不到
    mazerunner
    的实例实际添加到
    框架中


    您可能希望进行通读,这将使人们更容易阅读您的代码,您也更容易阅读其他人

    paintComponent
    由于三个基本原因不会被调用。该组件未连接到有效的本机对等方(即,它未直接或间接连接到屏幕上可见的窗口)或者它的大小不大于0x0,或者它不可见…1)为了更快地获得更好的帮助,发布一个(最小完整的可验证示例)。2)获取图像的一种方法例如,热链接到中看到的图像。