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