автоматическая перекраска при сворачивании окна - PullRequest
1 голос
/ 19 ноября 2010

У меня есть JFrame, с двумя панелями, на одной панели я рисую линию, когда я работаю, я минимизирую Окно Java-программы, которое я делаю, когда я максимизирую его, ЛИНИЯ, КОТОРАЯ Я ДРУЖИЛА, БЫЛА РАЗНОЙперекрасил его в другом месте!

Кто-нибудь имеет представление о том, как заблокировать картину, чтобы при сворачивании она не привинчивала рисунок ??

Спасибо!

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.imageio.ImageIO;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;


class JFramePaint1 extends JFrame implements ActionListener /*implements ActionListener*/{

    public static int activa = 0;
    public static JButton drawing = new JButton("drawing");
    public static JButton erase = new JButton("erase");
    public static int x1=0, y1=0,x2=0,y2=0;

   public JFramePaint1(){
                                                    //row column
      JPanel container = new JPanel(); //new JPanel(new GridLayout(2,1));
      JPanel header = new JPanel();
    //  header.setLayout(new GridLayout(50, 2));
    // header.setLayout(new FlowLayout());
     header.setLayout(new BoxLayout(header, BoxLayout.LINE_AXIS));
     container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS)); //lo quite ahorita
     // container.setLayout(new FlowLayout());

     ContentComponent c = new ContentComponent();

      drawing.addActionListener(this);
      erase.addActionListener(this);

    //header.setSize(30,30);

     //drawing.setAlignmentY(Component.BOTTOM_ALIGNMENT);
     container.add(Box.createRigidArea(new Dimension(100, 0)));

     header.add(drawing); //lo quite ahorita
     header.add(erase);
     container.add(header);
    //container.add(Box.createRigidArea(new Dimension(5,0)));
    //header.add(drawing);

      // container.add(header);
      container.add(c);   //lo quite ahorita

      add(container);

    //  add(c);
       //add(c);
   }
   public static void main(String[] a) {

        JFramePaint1 VentanaDiverti = new JFramePaint1();
        VentanaDiverti.setSize(800, 700);
        VentanaDiverti.setLocation(200, 0);
        VentanaDiverti.setTitle("Diverti");
        VentanaDiverti.setResizable ( false );
        VentanaDiverti.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        VentanaDiverti.setVisible(true);

    /* JFrame f = new JFrame();
    // JFramePaint1 f = new JFramePaint1();
       f.setTitle("Drawing Graphics in Frames");
        f.setSize(800, 650);
        f.setLocation(200,50);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        f.setContentPane( new ContentComponent());
        f.getContentPane().add(b);

        //f.addWindowListener(this);
        //b.addActionListener(this);


        f.setVisible(true);*/

   }
   static class ContentComponent extends JPanel {

     public void paint(Graphics g) {

         BufferedImage image;
         /*reset the variables, this makes the repaint look the same! it's as comments so that you can see what happens
         x1=0;
            y1=0;
            x2=0;
            y2=0;
        */
       try {                
          image = ImageIO.read(new File("image name and path"));
       } catch (IOException ex) {
            // handle exception...
       }


         g.setColor (Color.RED);
         // void    fillRect(int x, int y, int width, int height)
         // Fills the specified rectangle.
         g.fillRect(0, 0, 800, 600);
         if( activa == 1){

         g.setColor(Color.BLACK);
        // g.drawRect(40, 40, 150, 80);
         int x = 40;
         int y= 40;
         for(int i = 0; i< 4; i++){

            //g.drawRect(x+10, y+10, 150, 80);
            x = x+10;
            y = y+10;
         }
         //drawLine(int x1, int y1, int x2, int y2)
         //Draws a line, between the points (x1, y1) and (x2, y2) in this graphics context's coordinate system.
           x1+=20;
           x2+=20;
           y2+=50;
           g.drawLine(x1,y1,x2,y2);
           x2+=30;
           y1=y2;
           g.drawLine(x1,y1,x2,y2);
          // g.drawLine(20,0,20,50);

         }
        // activa = 0;

      }//del paint
   }
    public void actionPerformed(ActionEvent e)
      {
          if(e.getSource()== drawing)
        {   System.out.println("entro");
           if(activa==0){
            activa = 1;

            repaint();}

        }
        if(e.getSource()==erase){
            activa = 0;
            x1=0;
            y1=0;
            x2=0;
            y2=0;
            repaint();
        }
      }
    public void windowClosing(WindowEvent e) 
     {

        System.exit(0);

     }
     public void windowOpened(WindowEvent e){}

     public void windowClosed(WindowEvent e){}

     public void windowActivated(WindowEvent e){}

     public void windowDeactivated(WindowEvent e){}

     public void windowIconified(WindowEvent e){}

     public void windowDeiconified(WindowEvent e){}  
}

Ответы [ 3 ]

1 голос
/ 19 ноября 2010

Я думаю, что программа не может автоматически рисовать, когда я ее минимизирую, а затем максимизирую.

Это очень нормально.Метод paint может быть вызван в в любое время , когда системе необходимо перерисовать часть вашего окна (см. Рисование в AWT для получения более подробной информации).Когда вы минимизируете окно, все, что вы нарисовали в нем раньше, не сохраняется в любом месте, поэтому, когда вы максимизируете окно, все содержимое должно быть нарисовано снова, поэтому paint будет вызываться автоматически.

По этой причине вам не следует выполнять какие-либо обновления ваших данных в paint.Вы должны сделать это в отдельном методе, сохранить результаты в своих переменных и использовать только эти существующие результаты для рисования содержимого.

Поскольку следующие части не изменяются:

image = ImageIO.read(new File("image name and path"));
x1+=20;
x2+=20;
y2+=50;
x2+=30;

переместите их в отдельный метод, скажем updatePoints.Затем в вашем методе actionPerformed сначала вызовите updatePoints(), а затем repaint().

0 голосов
/ 20 ноября 2010

По сути, просто чтобы добавить к сказанному Касабланкой, то, что происходит, так как переменные x1, x2, y1, y2 являются статическими, они обновляются каждый раз, когда вы выполняете рисование, и затем сохраняете это значение до тех пор, пока следующий перекрас, когда они снова обновляются и т.д ...

Я бы порекомендовал отделить ваши данные от кода вашего дисплея. Таким образом, вместо того, чтобы x1, x2, y1 и y2 были объявлены как статические глобальные переменные, сделайте их частью внутреннего класса (то, что вы называете ContentComponent), и начальные значения x1, x2, y1, y2 в качестве ваших глобальных переменных, например это: * * 1003

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.imageio.ImageIO;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;

class JFramePaint1 extends JFrame implements ActionListener /*implements ActionListener*/{

  public static int activa = 0;
  public static JButton drawing = new JButton("drawing");
  public static JButton erase = new JButton("erase");
  public static final int sx1 = 0, sy1 = 0, sx2 = 0, sy2 = 0;

  public JFramePaint1() {
    //row column
    JPanel container = new JPanel(); //new JPanel(new GridLayout(2,1));
    JPanel header = new JPanel();
    //  header.setLayout(new GridLayout(50, 2));
    // header.setLayout(new FlowLayout());
    header.setLayout(new BoxLayout(header, BoxLayout.LINE_AXIS));
    container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS)); //lo quite ahorita
    // container.setLayout(new FlowLayout());

    ContentComponent c = new ContentComponent();

    drawing.addActionListener(this);
    erase.addActionListener(this);

    //header.setSize(30,30);

    //drawing.setAlignmentY(Component.BOTTOM_ALIGNMENT);
    container.add(Box.createRigidArea(new Dimension(100, 0)));

    header.add(drawing); //lo quite ahorita
    header.add(erase);
    container.add(header);
    //container.add(Box.createRigidArea(new Dimension(5,0)));
    //header.add(drawing);

    // container.add(header);
    container.add(c); //lo quite ahorita

    add(container);

    //  add(c);
    //add(c);
  }

  public static void main(String[] a) {

    JFramePaint1 VentanaDiverti = new JFramePaint1();
    VentanaDiverti.setSize(800, 700);
    VentanaDiverti.setLocation(200, 0);
    VentanaDiverti.setTitle("Diverti");
    VentanaDiverti.setResizable(false);
    VentanaDiverti.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    VentanaDiverti.setVisible(true);

    /* JFrame f = new JFrame();
    // JFramePaint1 f = new JFramePaint1();
       f.setTitle("Drawing Graphics in Frames");
        f.setSize(800, 650);
        f.setLocation(200,50);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        f.setContentPane( new ContentComponent());
        f.getContentPane().add(b);

        //f.addWindowListener(this);
        //b.addActionListener(this);


        f.setVisible(true);*/

  }
  static class ContentComponent extends JPanel {

    static int x1, x2, y1, y2;

    public void paint(Graphics g) {
      x1 = sx1;
      x2 = sx2;
      y1 = sy1;
      y2 = sy2;

//      BufferedImage image;
      /*reset the variables, this makes the repaint look the same! it's as comments so that you can see what happens
      x1=0;
         y1=0;
         x2=0;
         y2=0;
      */
//      try {
//        image = ImageIO.read(new File("image name and path"));
//      } catch(IOException ex) {
//        // handle exception...
//      }

      g.setColor(Color.RED);
      // void    fillRect(int x, int y, int width, int height)
      // Fills the specified rectangle.
      g.fillRect(0, 0, 800, 600);
      if(activa == 1) {

        g.setColor(Color.BLACK);
        // g.drawRect(40, 40, 150, 80);
        int x = 40;
        int y = 40;
        for(int i = 0; i < 4; i++) {

          //g.drawRect(x+10, y+10, 150, 80);
          x = x + 10;
          y = y + 10;
        }
        //drawLine(int x1, int y1, int x2, int y2)
        //Draws a line, between the points (x1, y1) and (x2, y2) in this graphics context's coordinate system.
        x1 += 20;
        x2 += 20;
        y2 += 50;
        g.drawLine(x1, y1, x2, y2);
        x2 += 30;
        y1 = y2;
        g.drawLine(x1, y1, x2, y2);
        // g.drawLine(20,0,20,50);

      }
      // activa = 0;

    }//del paint
  }

  public void actionPerformed(ActionEvent e) {
    if(e.getSource() == drawing) {
      System.out.println("entro");
      if(activa == 0) {
        activa = 1;

        repaint();
      }

    }
    if(e.getSource() == erase) {
      activa = 0;
      repaint();
    }
  }

  public void windowClosing(WindowEvent e) {

    System.exit(0);

  }

  public void windowOpened(WindowEvent e) {}

  public void windowClosed(WindowEvent e) {}

  public void windowActivated(WindowEvent e) {}

  public void windowDeactivated(WindowEvent e) {}

  public void windowIconified(WindowEvent e) {}

  public void windowDeiconified(WindowEvent e) {}
}
0 голосов
/ 19 ноября 2010

Вы можете добавить слушатель окна к вашему jframe, который вызывает метод рисования панелей, когда происходит изменение размера / максимизации / любого другого события.

...