Почему мой JLabel не показывается? - PullRequest
0 голосов
/ 28 мая 2018

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

У меня есть класс, который обрабатывает ввод с клавиатуры (с именем KeyInputHandler) и другой класс (с именем DrawGameBoard), который создает окно и фон.В DrawGameBoard у меня есть метод, который называется moveIcon, который должен отображать значок.

public class DrawGameBoard extends JPanel
{ 
 public static DrawGameBoard panel = new DrawGameBoard();
 public static JFrame window = new JFrame("Fill the Boxes");
 public static Container c = window.getContentPane();

 public void moveIcon(int x, int y, JLabel label)
{
  c.add(label);
  //label.setLocation(x,y);
  c.validate();
  c.repaint();
  System.out.println("tried to show a label");
}
public void paintComponent(Graphics g) 
{
 super.paintComponent(g);
 g.setColor(Color.GRAY);
 g.fillRoundRect(5, 5, 585, 585, 15, 15);
 for(int x = 25; x < 515; x+=79)
 {
   for(int y = 25; y< 515; y+=79)
   {
     g.setColor(Color.BLACK);
     g.fillRect(x, y, 68, 68);
     g.setColor(Color.WHITE);
     g.fillRect(x+10, y+10, 48, 48);
   } 
 }
} 
   public static void main(String[] args)
 {
 KeyInputHandler k = new KeyInputHandler();

//create the window
//JFrame window = new JFrame("Fill the Boxes");
window.setBounds(0, 0, 600, 630);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setResizable(false);

//create the panel
//DrawGameBoard panel = new DrawGameBoard();
//Container c = window.getContentPane();
panel.setBackground(new Color(0,222,222));
panel.addKeyListener(k);
panel.setFocusable(true);
//panel.setLayout(null);//doesnt use default locations

c.add(panel);
window.setVisible(true);
}
}
}

Это вызывается в KeyInputHandler

   public void keyPressed(KeyEvent e)
   {
    System.out.println("keyPressed: ");
    BoxGame b = new BoxGame();
    DrawGameBoard d = new DrawGameBoard();

    //create icons to be moved
    MovingPlayerIcon icon1 = new MovingPlayerIcon(1,0);
    JLabel p1fill = new JLabel();
    p1fill.setIcon(icon1);

////////////////////////////////////////////////////////////////     
    //controls for p1
    if (e.getKeyCode() == KeyEvent.VK_A) {
      if(b.getX1()>0){
        b.setPos(b.getX1()-1, b.getY1(), 1);
      }
    System.out.println("A");
    d.moveIcon(0,0,p1fill);
    }
////////////////////////////////////////////////////////////////    
}

Итак, когда я нажимаю 'A', вызывается метод moveIcon.Я знаю, что вызывается метод moveIcon, потому что при нажатии клавиши «А» печатается «А» и печатается «попытка показать этикетку».Я попытался заменить мой значок обычным текстом JLabel, и он тоже не отображался.

Дополнительная информация:

У меня setLocation () закомментирован из класса moveIcon, потому что раньше у меня былоустановите макет JPanel на ноль (он больше не настроен).(Я хотел разместить иконки в определенных местах, но сейчас меня это не беспокоит)

BoxGame - это класс, который обрабатывает информацию о местоположении игроков, такую ​​как текущие значения X и Y,Это не должно влиять на дисплей.

MovingPlayerIcon - это класс, который рисует значок цветами в зависимости от параметров.Опять же, я не думаю, что это влияет на отображение, так как я пытался заменить значок обычным текстом JLabel, и там тоже ничего не произошло.

Итак, есть идеи, почему JLabel не появляется?

Я программирую на Java чуть больше года.Я очень ценю ваше время и помощь.Дайте мне знать, если вам понадобится какая-либо дополнительная информация (я старался быть как можно более конкретным).Большое спасибо!

1 Ответ

0 голосов
/ 29 мая 2018

Итак, вам нужно нарисовать метку при нажатии клавиши «А».Вместо использования вашего метода 'moveIcon' вы можете просто нарисовать метку в нужном месте и в нужное время, используя метод 'paintComponent'. Объявите эти переменные в вашем классе ..

boolean paint = false;
int x = 100;
int y = 100;
  • Теперь добавьте следующие строки кода в ваш метод paintComponent

    if (paint == true) {g.drawString ("Ваш желаемый текст", x, y);}

  • Сделать класс KeyInputHandler внутренним классом класса Draw Game Board

  • Теперь вВаш метод 'keyPressed', выполните следующую строку кода, когда клавиша 'A' нажата

    DrawGameBoard.this.paint = true;DrawGameBoard.this.x = 100;DrawGameBoard.this.y = 100;перекрасить ();

...