BG изображение с Swing без переопределения краскиКомпонент - PullRequest
1 голос
/ 25 сентября 2011

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

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

Самый популярный способ поиска - переопределение метода paintComponent, но я не могу этого сделать, поскольку я создал свои JPanels в отдельных методах, а не в классах. Все они содержатся в моем оригинальном 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);
        }
    };

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

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

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

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

Я не могу поместить кнопки в ТОП jLabel),

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

1 голос
/ 25 сентября 2011

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

Вы всегда можете создать анонимный внутренний класс, производный от 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();
         }
      });
   }
}
...