Рисование текста или изображений поверх сетки - PullRequest
1 голос
/ 16 мая 2011

Я пишу игру на основе тетриса и использую GridLayout для отображения фактического вала, на который падают фигуры тетриса.GridLayout заполнен небольшими объектами JLabel.Шахта сама по себе является JPanel внутри другой JPanel, панели, которую я использую, чтобы содержать и контролировать всю игру.Когда игра закончится, я хочу, чтобы в верхней части сетки появилось слово «ИГРА НАД», возможно, сопровождаемое небольшим изображением.

Мой вал - это экземпляр ShaftPanel, который расширяет JPanel (чтобы я мог переопределить paintComponent) и является вложенным закрытым классом (поэтому он имеет доступ к частным переменным экземпляра большего JPanel).Закрытая переменная экземпляра, к которой он должен получить доступ, является логической игрой, которая имеет значение true, когда игра находится в сеансе, и имеет значение false, когда игра заканчивается.Вот код для моего класса ShaftPanel:

public class ShaftPanel extends JPanel {

public ShaftPanel(GridLayout g){
  super(g);
}

public void paintComponent(Graphics g){
  super.paintComponent(g); 
  if(game)
    return; 
  g.setColor(Color.WHITE);
  g.setFont(new Font("Courier New", Font.BOLD, 15));
  char[] c = {'G','A','M','E',' ','O','V','E','R'}; 
  g.drawChars(c,0,c.length,45,45);
}

}

У меня есть один метод в более крупном классе, вызывающий метод Repaint () вала в соответствующее время.Добавление оператора print указывает, что метод paintComponent вызывается, когда я этого хочу, и что методы setColor, setFont, drawChars вызываются в правильное время.Однако ничего не появляется.Я очень подозреваю, что текст рисуется под сеткой JLabels, поэтому его невозможно увидеть, но я не знаю, как решить эту проблему.JLabels внутри сетки должны оставаться непрозрачными, потому что программа полагается, что они имеют разные цвета.Есть ли способ заставить paintComponent рисовать текст поверх чего-либо еще на панели?

Ответы [ 2 ]

1 голос
/ 16 мая 2011

См. Раздел из учебника по Swing на Использование стеклянной панели для примера и объяснения того, как работает стеклянная панель.

Другой вариант - использовать JWindow для отображения метки с вашим сообщением и значком.

1 голос
/ 16 мая 2011

Я бы, наверное, не сделал тетрис таким образом, но один из способов проверить это - убрать "if (game)" и посмотреть, пишется ли игра окончена, даже когда нет JLabels (если они не всегда есть). а иногда и пустые).

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

Смотрите здесь для получения дополнительной информации и кода: http://www.java2s.com/Code/Java/Swing-JFC/Paintonglasspane.htm

...