Изображение BG с Swing без переопределения paintComponent

В настоящее время я разрабатываю меню с несколькими экранами с несколькими кнопками на каждом экране. Чтобы использовать кнопки поверх фонового изображения, которое находится в jLabel (по умолчанию я не могу размещать кнопки в верхней части jLabel), я использовал GridBagLayout с двумя панелями/экраном меню, одна панель с кнопками (непрозрачная = false) и одну панель с фоновым изображением или jLabel. Чтобы переключать текущие отображаемые панели в зависимости от того, где пользователь находится в меню, я сделал каждый экран меню (то есть каждые 2 панели) отдельными методами, а не классами.

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

Самым популярным способом, который я искал, было переопределение метода paintComponent, но я не могу этого сделать, так как я создал свои панели JPanel в отдельных методах, а не в классах. Все они содержатся в моем исходном JFrame.

Помощь будет принята с благодарностью, спасибо!

Только что добавил этот код, но мой фон по какой-то причине остается белым? Пробую другое предложение прямо сейчас, спасибо, ребята!

private void mainPanel() {

    icon = new ImageIcon(getClass().getResource("/phantasma/menuv1.png"));
mainContainer1 = new javax.swing.JPanel() {
        @Override
        protected void paintComponent(Graphics g) {
            g.drawImage(icon.getImage(), 0,0, null);
            super.paintComponent(g);
        }
    };

person user16666322    schedule 24.09.2011    source источник
comment
Почему вы не можете переопределить paintComponet? Я не вижу ничего выше, что убеждает меня в том, что это невозможно сделать в вашей программе. Вы всегда можете создать анонимный внутренний класс, производный от JPanel, и при необходимости переопределить там метод paintComponent.   -  person Hovercraft Full Of Eels    schedule 25.09.2011
comment
Опять же, согласно моему комментарию, вы должны вызвать метод super.paintComponent() в качестве первого вызова переопределения вашего paintComponent. В противном случае вы можете стереть все, что было нарисовано ранее.   -  person Hovercraft Full Of Eels    schedule 25.09.2011
comment
@ user962797, почему вы рисуете на заказ? Ваш вопрос касался рисования изображения БЕЗ переопределения paintComponent(). Вы не читали мой комментарий? Почему бы вам не использовать компонент, который рисует за вас? Зачем изобретать велосипед, если в этом нет необходимости.   -  person camickr    schedule 25.09.2011


Ответы (2)


В моем комментарии выше я утверждаю:

Вы всегда можете создать анонимный внутренний класс, производный от JPanel, и при необходимости переопределить там метод paintComponent.

В качестве примера того, что я имею в виду, вы можете переопределить paintComponent в любой JPanel, которую вы создаете, независимо от того, является ли она производной от автономного класса или создана в методе. Например,

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.*;

public class AnonInnerPanel {

   private static void createAndShowGui() {
      JPanel mainPanel = new JPanel() {
         @Override
         protected void paintComponent(Graphics g) {
            super.paintComponent(g);
         }

         @Override
         public Dimension getPreferredSize() {
            return new Dimension(300, 200);
         }
      };

      JFrame frame = new JFrame("AnonInnerPanel");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
person Hovercraft Full Of Eels    schedule 24.09.2011
comment
Большое спасибо! понятия не имел, что вы можете это сделать, я уверен, что очевидно, что я новичок в программировании :). У меня все еще есть проблема, после этого по какой-то причине мой фон остается белым после этого. РЕДАКТИРОВАТЬ: лол к - person user16666322; 25.09.2011
comment
Почтовый код как редактирование исходного сообщения, а не в комментарии, где он нечитаем. Также взгляните на предложение camickr, так как оно, вероятно, лучше моего. Я бы проголосовал за это, но у меня нет голосов! Кроме того, вам, вероятно, следует вызвать super.paintComponent(g) в первой строке вашего метода, иначе он может стереть все нарисованное. - person Hovercraft Full Of Eels; 25.09.2011
comment
Если я не смогу заставить это работать через некоторое время, я попробую другое предложение, но я использую конструктор для базового макета, так как я действительно плохо делаю вещи LayoutManager строго по коду, лол. Да, я переключил вызов paintComponent на первую строку, все еще отображая белый цвет, в данный момент пробуя другие вещи. Спасибо за постоянную помощь. - person user16666322; 25.09.2011
comment
еще раз спасибо! теперь работает отлично, так здорово, что вы можете так переопределить: O - person user16666322; 25.09.2011

Изображение BG с Swing без переопределения paintComponent

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

Если вы хотите, чтобы изображение было нарисовано в реальном размере, используйте JLabel.

Я не могу поставить кнопки в ВЕРХ jLabel),

Что вы можете. Просто установите LayoutManager для JLabel, а затем вы сможете добавить к нему любой компонент так же, как вы добавляете компоненты на панель.

person camickr    schedule 24.09.2011
comment
Теперь, когда мои голоса были пополнены, я могу проголосовать за ваш пост. Опять же, это лучший ответ. - person Hovercraft Full Of Eels; 25.09.2011
comment
Я могу попробовать это позже, но мне придется многое узнать о ручном кодировании материалов Layout Manager. gridbag достаточно прост, но я не знаю о макете группы, лол. Еще раз спасибо вам обоим! - person user16666322; 25.09.2011
comment
Использование JLabel ничем не отличается от использования JPanel. Какой бы код вы ни использовали для добавления компонентов на панель, он будет таким же и для метки. Единственное отличие состоит в том, что по умолчанию JPanel использует FlowLayout. Поэтому вам может понадобиться добавить label.setLayout( new FlowLayout() ); - person camickr; 25.09.2011