repaint()不起作用 - 我错了什么

时间:2014-05-30 13:14:36

标签: java swing repaint

你能告诉我为什么我的repaint()方法在我的代码中不起作用吗?你知道一些网站,我可以从中学到基本知识。提前致谢。

public class OknoGry extends JFrame
{   
public static enum Tryb{NOWA_GRA,LISTA_NAJLEPSZYCH, USTAWIENIA,   MENU}                             
private JButton nowa_gra,wyjscie,ustawienia,lista_najlepszych;  

OknoGry()
{
    zaladujPrzysicki();
}


public void zaladujPrzysicki(){

    JFrame okno_gry = new JFrame ("LUNAR LANDER");
    JPanel panel = (JPanel)okno_gry.getContentPane();
    panel.setLayout(null);
    okno_gry.setBounds(0,0,600,400);
    okno_gry.setVisible(true);
    wyjscie = new JButton("Wyjscie");
    wyjscie.setBounds(150, 200, 300, 50);
    wyjscie.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent event) {
               System.exit(0);
          }
       });
    panel.add(wyjscie);
    nowa_gra = new JButton("Nowa Gra");
    nowa_gra.setBounds(150,150,300,50);
    nowa_gra.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent event) {
               przyciskNowaGra();
            //   repaint();
          }
       });
    panel.add(nowa_gra);
    ustawienia = new JButton("Ustawienia");
    ustawienia.setBounds(150, 100, 300, 50);
    ustawienia.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent event) {
               przyciskUstawienia();
          }
       });
    panel.add(ustawienia);

    lista_najlepszych = new JButton("Lista Najlepszych Wynikow");
    lista_najlepszych.setBounds(150, 50, 300, 50);
    lista_najlepszych.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent event) {
               przyciskListaNajlepszych();
          }
       });
    panel.add(lista_najlepszych);
    okno_gry.addWindowListener(new WindowAdapter() {                                    
        public void windowClosing(WindowEvent we) {
            System.exit(0);
        }
    });
    okno_gry.setVisible(true);
    okno_gry.setResizable(false);
//  panel.paintComponents(g);

}
protected void przyciskUstawienia() {
    tryb_gry = tryb_gry.USTAWIENIA;
}
protected void przyciskListaNajlepszych() {

    tryb_gry = tryb_gry.LISTA_NAJLEPSZYCH;
}
protected void przyciskNowaGra() {

    tryb_gry = tryb_gry.NOWA_GRA;
    //System.out.println("uzytkowniku kliknales na przysick nowa gra");
    nowa_gra.setVisible(false);
    wyjscie.setVisible(false);
    ustawienia.setVisible(false);
    lista_najlepszych.setVisible(false);
    //System.out.println(tryb_gry);

    repaint();

}
public void rysujMape(Graphics g){                  
        Dimension dim = getSize();                      
        System.out.println("JESTEM W METODZIE rysujMape");
        System.out.println(punkt_y1*dim.height);
        System.out.println(punkt_x2*dim.width);
        g.drawLine(0, punkt_y1*dim.height/100, punkt_x2*dim.width/100, punkt_y2*dim.height/100);                    
        g.drawLine(punkt_x2*dim.width/100, punkt_y2*dim.height/100, punkt_x3*dim.width/100, punkt_y3*dim.height/100);
        g.drawLine(punkt_x3*dim.width/100,punkt_y3*dim.height/100,punkt_x4*dim.width/100,punkt_y4*dim.height/100);
        g.drawLine(punkt_x4*dim.width/100,punkt_y4*dim.height/100, punkt_x5*dim.width/100,punkt_y5*dim.height/100);


}
public void paintComponent(Graphics g)           
{   
  super.paintComponent(g);
    System.out.println("jestem w metodzie paintComponent");
    switch(tryb_gry){
    case NOWA_GRA:{

    rysujMape(g);               
    rakieta.rysujRakiete(g);
    break;
    }
    case USTAWIENIA:{
        break;
    }
    case LISTA_NAJLEPSZYCH:{
        break;
    }
    case MENU:{
        break;
    }
    default:{

        break;
    }
    }
}

public static void main(String args[])
{
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            //createAndShowGUI();
            OknoGry gf = new OknoGry();
        }
    });
}}

我不知道为什么它不起作用,请帮忙。

1 个答案:

答案 0 :(得分:2)

  1. 您的课程是JFrame 没有paintComponent方法,所以实际上并没有覆盖任何绘画功能。

    < / LI>
  2. 您的类已经是JFrame,但您在构造函数中创建了另一个JFrame实例。为什么?唐&#39;吨。选择其中一个。

  3. paintComponent应在JPanel中覆盖。因此,创建一个扩展JPanel的类,覆盖该面板中的paintComponent,然后将该面板添加到您的框架中。

  4. 使用@Override注释,以便了解您是否正确覆盖了某个方法。

    @Override
    protected void paintComponent(Grapchics g) {}
    
  5. 当您致电repaint()时,请确保您在面板上而不是相框中调用它。

  6. 有关绘画的更多信息,请参阅Performing Custom Painting

  7. 在添加组件后将框架设置为

  8. 避免使用空布局。学习使用布局管理器。请参阅Laying Components Within a container