当前位置: 首页 > 知识库问答 >
问题:

没有调用油漆组件

秦焱
2023-03-14

我试图编写一个小迷宫运行程序,遇到了一些与绘图组件()相关的麻烦。我已经完成了调试,出于某种原因,我的绘图组件()从未被调用,即使是由我的计时器调用的重新绘制()。

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和jpanel init方法。

@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();
    }

这就是我的ActionExecuted,它是用我的计时器调用的,默认设置为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();
    }

}

}

如果你感兴趣,这是我的完整代码。我的问题是为什么我不能把图像画到迷宫面板上。

共有1个答案

鲁浩言
2023-03-14

由于三个基本原因,不会调用油漆组件

  1. 该组件没有附加到有效的本机对等体(即,它没有直接或间接地附加到屏幕上可见的窗口)
  2. 或者它的大小不大于0x0
  3. 或者它不可见...

浏览一下你的代码,我在任何地方都找不到mazerunner的实例被添加到框架中。。。

你可能想通读JavaTM编程语言的代码约定,这将使人们更容易阅读你的代码,也让你更容易阅读别人的代码

 类似资料:
  • 问题内容: 对不起,我进行了大量搜索,以查找这3个功能(绘画,重绘,paintComponent)之间如何相互作用,但我不知道。您能准确解释一下它们何时被调用(因为有时java会在没有我问他的情况下调用它),它们到底在做什么,它们之间有什么区别。谢谢 问题答案: 我不确定“ paint”,但是我可以解释repaint()和paintComponent()之间的关系。 根据我在Java方面的有限经验

  • 本章介绍Canvas组件,用它来生成简单的二维(2D)图形,目标是创建一个PaintPot(油漆桶)应用,让用户在手机屏幕上绘制图画,并让用户用手机给自己拍照,然后在自己的照片上绘图。回顾历史,早在20世纪70年代,PaintPot是最早运行在个人电脑上的应用之一,目的是为了证明个人电脑的潜力。那时候,开发这样一款简单的绘图应用是一项极其复杂的工作,而且绘图效果也略显粗糙。但现在,使用App In

  • 我编写了一些Java Swing代码,收集一些输入,进行一些计算,然后显示结果。 预期结果: 对于每个用户输入: 用户转到文件->新建->输入一些数据。 在计算过程中鼠标光标变为旋转器。 显示结果。 鼠标光标返回默认值。 null 请注意,我对此示例进行了大量删减,以消除实际程序中的大量U/I流,但此示例确实如所描述的那样中断。我无法进一步简化示例代码。 简化代码 感谢任何帮助。请假设我是一个完全

  • 我正在用Java开发一个俄罗斯方块克隆,在我想要清除整行并删除上面的所有内容之前,一切似乎都正常工作。虽然我所有的数据都正确地表示了转换,但我的paintComponent方法似乎只清除了行,但上面显示的所有内容都保持在repaint()调用之前的状态。新的碎片将穿过幻影积木,落在最下面一排的隐形积木上,上面的碎片会落在那里。 这是我的油漆成分方法: 这是计时器侦听器中actionPerforme

  • 问题内容: 我是绘画/图形的新手,想知道如何以一种方式将JPanel添加到我的代码 中,以使整个图形位于JPanel而不是 JFrame上。 换句话说,我正在尝试创建一个允许我执行此操作的GUI:在 右侧,在左侧的JPanel上显示行的漂亮运动,在其上 添加一个JTextArea(在JPanel上),该行将显示 图形的协调。 这是一个更大问题的简化,但是我想这里的代码更容易理解。 谢谢!!! 问题

  • 我正在尝试创建一个条形图,需要为N个类别使用特定的系列颜色,为1个其他类别使用单独的颜色。下面是一个示例: 在模型中,类别1-3使用5种颜色的集合来渲染其系列,而类别4使用单一的灰色。我的第一种方法是使用定制类覆盖getItemPaint()方法,但我只能在类别级别而不是系列级别定义颜色。是否可以在类别和/或系列级别上定义颜色?比如, 我的另一个想法是将iReport的系列颜色条形图属性和getI