2016-12-22 4 views
0

EDIT: Первый вопрос решен, см. Roberto Attias 's answer и, возможно, прочитайте комментарий. Еще есть второй вопрос.Рисование imageS в java с использованием AWT

Мне нужно сделать небольшую 2D-игру на Java, и я хочу как можно больше придерживаться AWT (так что ни SWING, ни Java2D, если это абсолютно необходимо).

У меня есть окно, и я могу нарисовать изображение на нем, но есть две проблемы. Сначала я не могу нарисовать более одного изображения. На самом деле с некоторыми из моих тестов, когда в отладке я вижу, что моя программа будет рисовать мои два изображения только для их удаления и повторного рисования первого изображения. Во-вторых, что первое изображение, которое вновь обращается не на координате она должна (ее немного слева и ниже)

На данный момент у меня есть что-то вроде этого:

public class AwtManager { 
    private Frame frame; 
    private Panel panel; 
    public AwtManager(){ 
     frame = new Frame("a"); 
     frame.setSize(800,600); 
     frame.setLocation(100, 100); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowEnvent){ 
       System.exit(0); 
      } 
     }); 

    panel = new Panel(); 
    // here I tried to setBounds to solve my second issue, it didn't work 
    //panel.setBounds(0, 0, 800, 600); 
    frame.add(panel); 
    frame.setVisible(true); 
    } 

Эта часть открытого мои окна и работы довольно хорошо, но моя вторая проблема, похоже, вызвана границами моего кадра/панели, поэтому здесь может быть какая-то смена.

public void showMytwoImagesFFS(ArrayList<ImageComponent> images){ 
     for (int i = 0; i < images.size(); i++) { 
      panel.add(images.get(i); 
      //And this is where I'm lost 

     } 
     // or here maybe 
     frame.setVisible(true); 
    } 
} 

Во второй части я попробовал каждую комбинацию Component.paint (г), Component.update (г), Component.repaint(), Component.setVisible (правда) я мог думать.

Мой объект ImageComponent просто так:

public class ImageComponent extends Component { 
    private static final long serialVersionUID = 1L; 
    private BufferedImage img; 
    private int x; 
    private int y; 

    public ImageComponent(String path,int x, int y){ 
     try{ 
      img = ImageIO.read(new File(path)); 
      this.x = x; 
      this.y = y; 
     } 
     catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 

Эта функция GetPreferredSize() меня беспокоит, как ад, он должен возвращать предпочтительный размер ImageComponent но, видимо, я должен поставить размер моего кадра/панели иначе это не сработает.

public Dimension getPreferredSize(){ 
     return new Dimension(800,600); 
    } 

И, наконец, моя краска, обновление, перекрашивать:

public void paint(Graphics g){ 
     g.drawImage(img, x, y,null);  
    } 

    public void update(Graphics g){ 
     super.update(g); 
    } 

    public void repaint(){ 
     this.getGraphics().drawImage(img, x, y, null); 
    } 
} 

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

Так что, пожалуйста, не могли бы вы помочь мне с этими проблемами, и, кстати, если вы знаете, как работает Component.setVisible (boolean), я бы хотел знать, потому что в debug mod эта функция заставила меня потерять некоторые волосы.

EDIT:

Вот скриншот моего окна, зная, что я попросил два красных квадрата (есть изображения не прямоугольник), один 0,0, другая на 200, 200.

Result of my program

EDIT 2: Вот полностью работоспособный код (я думаю):

import java.awt.*; 
import java.util.*; 
import java.awt.event.*; 

public class AwtManager { 
    private Frame frame; 
    private Panel panel; 

    public static void main(String args[]) { 
     new AwtManager(); 
     ArrayList<ImageComponent> images = new ArrayList<>(); 
     images.add(new ImageComponent("myimage.jpg", 0, 0)); 
     images.add(new ImageComponent("myimage.jpg", 200, 200)); 
     showMytwoImagesFFS(images); 
    } 


    public AwtManager(){ 
     frame = new Frame("a"); 
     frame.setSize(800,600); 
     frame.setLocation(100, 100); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowEnvent){ 
       System.exit(0); 
      } 
     }); 

     panel = new Panel(); 
     frame.add(panel); 
     frame.setVisible(true); 
    } 

    public void showMytwoImagesFFS(ArrayList<ImageComponent> images){ 
     for (int i = 0; i < images.size(); i++) { 
      panel.add(images.get(i)); 
     } 
     frame.setVisible(true); 
    } 
} 

import java.io.*; 
import java.awt.*; 
import java.awt.image.*; 
import javax.imageio.ImageIO; 
public class ImageComponent extends Component { 
    private static final long serialVersionUID = 1L; 
    private BufferedImage img; 
    private int x; 
    private int y; 

    public ImageComponent(String path,int x, int y){ 
     try{ 
      img = ImageIO.read(new File(path)); 
      this.x = x; 
      this.y = y; 
     } 
     catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 

    public Dimension getPreferredSize(){ 
     return new Dimension(800,600); 
    } 

    public void paint(Graphics g){ 
     g.drawImage(img, x, y,null);  
    } 

    public void update(Graphics g){ 
     super.update(g); 
    } 

    public void repaint(){ 
     this.getGraphics().drawImage(img, x, y, null); 
    } 
} 
+0

«Первый вопрос решён», и вы не даете никаких очков? вы проиграли со всем уважением – gpasch

+0

Извините, я забыл, что могу дать точку, я был сосредоточен на «принятом ответе», о котором, к сожалению, я не могу сейчас дать, зная, что у меня все еще есть проблема. В любом случае, слава богу, вы заметили, что я совершенно новичок в вопросе о SO (только 11 из этих священных точек) и не назвал себя «проигравшим». – Krowk

+0

Видимо, я не могу дать точку, мне нужно 15 из первых, что мне делать? – Krowk

ответ

0

Просто быстро мысль, но знаете ли вы идение bility каждого из ваших изображений в этом ArrayList? То есть

public void showMytwoImagesFFS(ArrayList<ImageComponent> images){ 
    for (int i = 0; i < images.size(); i++) { 
     images.get(i).setVisible(true);//is the visibility actually true? 
     panel.add(images.get(i); 

    } 
    // or here maybe 
    frame.setVisible(true); 
} 

Кроме того, есть ли у вас скриншоты того, как выглядит ваша программа на данный момент? С проблемами gui я считаю, что их легче решить, если я смогу понять, что происходит.

+0

Я просто посмотрел на него, и если я спрошу: images.get (i) .isVisible(); Я получаю правку для обоих моих изображений Я добавлю скриншоты через несколько секунд. – Krowk

0

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

import java.awt.*; 
import java.util.*; 
import java.awt.event.*; 

public class AwtManager { 
    private Frame frame; 
    private Panel panel; 

    public static void main(String args[]) { 
     new AwtManager(); 
    } 


    public AwtManager(){ 
     frame = new Frame("a"); 
     frame.setSize(800,600); 
     frame.setLocation(100, 100); 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowEnvent){ 
       System.exit(0); 
      } 
     }); 

    panel = new Panel(); 
    // here I tried to setBounds to solve my second issue, it didn't work 
    //panel.setBounds(0, 0, 800, 600); 
    frame.add(panel); 
    ArrayList<ImageComponent> images = new ArrayList<>(); 
    images.add(new ImageComponent("myimage.jpg", 0, 0)); 
    showMytwoImagesFFS(images); 
    frame.setVisible(true); 
    } 

    public void showMytwoImagesFFS(ArrayList<ImageComponent> images){ 
     for (int i = 0; i < images.size(); i++) { 
      panel.add(images.get(i)); 
     } 
    } 
} 

import java.io.*; 
import java.awt.*; 
import java.awt.image.*; 
import javax.imageio.ImageIO; 

public class ImageComponent extends Component { 
    private static final long serialVersionUID = 1L; 
    private BufferedImage img; 
    private int x; 
    private int y; 

    public ImageComponent(String path,int x, int y){ 
     try{ 
      img = ImageIO.read(new File(path)); 
      this.x = x; 
      this.y = y; 
     } 
     catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 

    public Dimension getPreferredSize(){ 
     return new Dimension(800,600); 
    } 
    public void paint(Graphics g){ 
     g.drawImage(img, x, y,null); 
    } 

    public void update(Graphics g){ 
     super.update(g); 
    } 

    public void repaint(){ 
     this.getGraphics().drawImage(img, x, y, null); 
    } 
} 
+0

Извините, я не думал, что это будет проблема, я добавлю полностью исполняемый код к вопросу. В вашей версии вы вызываете showMyTwoImagesFFS (ArrayList ) в конструкторе до первого frame.setVisible(), который может работать в этом случае, но если я хочу, чтобы изображение появлялось через несколько секунд, любая причина для что? – Krowk

+0

Я не был уверен, когда вы намеревались добавить их. В большинстве случаев пользовательский интерфейс выставляется во время инициализации. Если вам нужно изменить внешний вид пользовательского интерфейса (добавить/удалить компонент, сменить менеджеров макетов и т. Д.) После визуализации, вам может потребоваться вызвать 'revalidate()' –

+0

О, я не знал этого, я сделаю некоторый тест с что в виду – Krowk