2016-11-18 7 views
0
public class buttonActionStart implements ActionListener {  // overwritten ActionListener 

     public void actionPerformed (ActionEvent e){ 
     JFrame window2 = new JFrame("Main Game"); //create empty frame 

     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     window2.setSize(screenSize.width,screenSize.height); 
     window2.add(new JPanel(){ 

     public void paintComponent(Graphics graph){ 
      super.paintComponent(graph); 

      Board board = new Board(); 

      graph.drawString(board.sqaures[1].getName(),440,560); 
      graph.drawString(board.sqaures[2].getName(),335,560); 
      graph.drawString(board.sqaures[3].getName(),225,560); 
      graph.drawString(board.sqaures[4].getName(),145,560); 
      graph.drawString(board.sqaures[5].getName(),30,560); 
      graph.drawString(board.sqaures[6].getName(),25,460); 
      graph.drawString(board.sqaures[7].getName(),25,360); 
      graph.drawString(board.sqaures[8].getName(),35,260); 
      graph.drawString(board.sqaures[9].getName(),25,160); 
      graph.drawString(board.sqaures[10].getName(),25,60); 
      graph.drawString(board.sqaures[11].getName(),140,60); 
      graph.drawString(board.sqaures[12].getName(),240,60); 
      graph.drawString(board.sqaures[13].getName(),340,60); 
      graph.drawString(board.sqaures[14].getName(),440,60); 
      graph.drawString(board.sqaures[15].getName(),530,60); 
      graph.drawString(board.sqaures[16].getName(),550,160); 
      graph.drawString(board.sqaures[17].getName(),545,260); 
      graph.drawString(board.sqaures[18].getName(),540,360); 
      graph.drawString(board.sqaures[19].getName(),550,460); 

      for (int i = 0; i < 6; i++) 
       graph.drawRect(10 + (i*100),10,100,100); 
      for (int j = 0; j < 4; j++) 
       graph.drawRect(10,110 + (j*100),100,100); 
      for (int k = 0; k < 4; k++) 
       graph.drawRect(510,110 + (k*100),100,100); 
      for (int l = 0; l < 6; l++) 
       graph.drawRect(10 + (l*100),510,100,100); 

      InputStream resource = UI.class.getResourceAsStream("player1.png"); 
      Image player1Image = null; 
      try{ 
       player1Image = ImageIO.read(resource); 
      }catch (IOException e){ 
       e.printStackTrace(); 
      } 

      resource = UI.class.getResourceAsStream("player2.png"); 
      Image player2Image = null; 
      try{ 
       player2Image = ImageIO.read(resource); 
      }catch (IOException e){ 
       e.printStackTrace(); 
      } 

      resource = UI.class.getResourceAsStream("player3.png"); 
      Image player3Image = null; 
      try{ 
       player3Image = ImageIO.read(resource); 
      }catch (IOException e){ 
       e.printStackTrace(); 
      } 

      resource = UI.class.getResourceAsStream("player4.png"); 
      Image player4Image = null; 
      try{ 
       player4Image = ImageIO.read(resource); 
      }catch (IOException e){ 
       e.printStackTrace(); 
      } 

      graph.drawImage(player1Image, 511, 511, null); 
      graph.drawImage(player2Image, 585, 510, null); 
      graph.drawImage(player3Image, 511, 585, null); 
      graph.drawImage(player4Image, 585, 585, null); 
      } 
     }); 
     window2.setVisible(true); 
    } 
} 

Я развиваю вид настольной игры, и эти четыре изображения будут служить значком игрока. Я хочу, чтобы игрок щелкнул изображение, которое им назначено вручную, затем щелкните в другом месте на экране, и изображение будет «обновлено» до этой позиции.Как добавить mouselistener к изображениям, которые вставляются с помощью graph.drawimage()?

«квадрат» и совет»будет мой сам определенный класс.

я получил еще одно окно, которое будет иметь кнопку„Пуск“и запуская выше графику, который можно сделать в новом окне.

Я нашел много людей, предлагая, чтобы добавить изображение с помощью JLabel и добавить JLabel в JFrame, но я обнаружил, что изображение будет охватывать мой графический

+2

Для имени [божества]: прекратить чтение изображения в 'paintComponent' - ваш опыт будет крайне медленным. Прочитайте один раз, нарисуйте их потом столько раз, сколько захотите, но перестаньте читать их каждый раз, когда компонент нуждается в боли! –

+0

Извините, не могли бы вы подробнее? Я не совсем понимаю, что вы имеете в виду. Вы имеете в виду, что это плохой способ читать изображение в paintComponent()? Я хочу еще раз спросить, нужно ли мне добавить JLabel в JPanel, прежде чем добавлять JLabel прямо в JFrame? –

+0

'Вы имеете в виду, что это плохой способ прочитать изображение в paintComponent()?' - yes. Метод рисования предназначен только для рисования и ни для чего другого. Изображения должны быть прочитаны в конструкторе вашего класса, поэтому они читаются только один раз, когда класс создается. Поэтому не создавайте класс Board. – camickr

ответ

0

Два варианта:.

  1. D o как предлагается и использовать JLabel. Говоря «изображение будет охватывать мою графику», вы, вероятно, имеете в виду, что прозрачные части изображения не будут отображаться на фоне. Если да, вызовите JLabel.setOpaque(false).
  2. Добавьте MouseListener к компоненту, для которого вы реализуете метод paintComponent() (возможно, реализацию JFrame). Затем вы будете получать события мыши всякий раз, когда пользователь нажимает на компонент. В реализации слушателя вам необходимо вручную проверить, попадают ли координаты в область одного из изображений.

Вообще говоря, для игры я бы предпочел вариант 2: вы используете пустой холст и рисуете свою сцену игры на холсте. Затем взаимодействие с пользователем управляется общим игровым логическим объектом, который делегирует игровым объектам, таким как «игрок», «NPC» и т. Д., На основе координат/нажатых клавиш и т. Д.

+0

Что значит прозрачная часть? Я имею в виду, мой образ довольно мал (25 * 25, как маленькая иконка). Вы имеете в виду незанятое место в JLabel? –

+0

Я предположил, что ваше изображение имеет прозрачные пиксели. Если это не так, и не только область изображения покрывается при использовании JLabel, тогда размер JLabel неверно задается LayoutManager. В этом случае загляните в макет Java Swing и как использовать LayoutManagers, чтобы JLabel не был изменен, чтобы быть больше, чем его предпочтительный размер. Если вы не знаете, что это значит, создайте минимальный пример своей версии с помощью JLabel и отправьте другой вопрос SO для этого примера. –

+0

По умолчанию JLabel непрозрачен. – camickr