2013-10-01 2 views
8

Как добавить обратное изображение в мой JPanel без создания нового класса или метода, но просто вставив его вместе с остальными атрибутами JPanel?Простейший способ установить изображение в качестве фона JPanel

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

Я искал способ просто добавить изображение, не создавая совершенно новый класс и в рамках одного и того же метода (пытаясь сохранить все организованное и простое).

Вот пример метода, который устанавливает свои JPanel:

public static JPanel drawGamePanel(){ 
    //Create game panel and attributes 
    JPanel gamePanel = new JPanel(); 
    Image background = Toolkit.getDefaultToolkit().createImage("Background.png"); 
    gamePanel.drawImage(background, 0, 0, null); 
    //Set Return 
    return gamePanel; 
} 
+0

поэтому в чем проблема создания пользовательской 'JPanel'? –

+0

Как добавить обратное изображение в мой JPanel без создания нового класса или метода, но просто вставив его вместе с остальными атрибутами JPanel? –

+0

Как я знаю, вы можете изменять цвет или создавать, как в примерах, которые вы видели 'extends JPanel' :) –

ответ

4

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

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); // paint the background image and scale it to fill the entire space 
    g.drawImage(/*....*/); 
} 

другой способ (немного сложный), чтобы создать второй пользовательский JPanel и положить его в качестве фона для вашего основного

ImagePanel

public class ImagePanel extends JPanel 
{ 
private static final long serialVersionUID = 1L; 
private Image image = null; 
private int iWidth2; 
private int iHeight2; 

public ImagePanel(Image image) 
{ 
    this.image = image; 
    this.iWidth2 = image.getWidth(this)/2; 
    this.iHeight2 = image.getHeight(this)/2; 
} 


public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    if (image != null) 
    { 
     int x = this.getParent().getWidth()/2 - iWidth2; 
     int y = this.getParent().getHeight()/2 - iHeight2; 
     g.drawImage(image,x,y,this); 
    } 
} 
} 

EmptyPanel

public class EmptyPanel extends JPanel{ 

private static final long serialVersionUID = 1L; 

public EmptyPanel() { 
    super(); 
    init(); 
} 

@Override 
public boolean isOptimizedDrawingEnabled() { 
    return false; 
} 


public void init(){ 

    LayoutManager overlay = new OverlayLayout(this); 
    this.setLayout(overlay); 

    ImagePanel iPanel = new ImagePanel(new IconToImage(IconFactory.BG_CENTER).getImage()); 
    iPanel.setLayout(new BorderLayout()); 
    this.add(iPanel); 
    iPanel.setOpaque(false);     
} 
} 

IconToImage

public class IconToImage { 

Icon icon; 
Image image; 


public IconToImage(Icon icon) { 
    this.icon = icon; 
    image = iconToImage(); 
} 

public Image iconToImage() { 
    if (icon instanceof ImageIcon) { 
     return ((ImageIcon)icon).getImage(); 
    } else { 
     int w = icon.getIconWidth(); 
     int h = icon.getIconHeight(); 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     GraphicsDevice gd = ge.getDefaultScreenDevice(); 
     GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
     BufferedImage image = gc.createCompatibleImage(w, h); 
     Graphics2D g = image.createGraphics(); 
     icon.paintIcon(null, g, 0, 0); 
     g.dispose(); 
     return image; 
    } 
} 


/** 
* @return the image 
*/ 
public Image getImage() { 
    return image; 
} 
} 
+0

Не должен ли комментарий кода быть на следующей строке? * «Другой способ (немного сложный) создать второй пользовательский JPanel и поставить в качестве фона для вашего основного». Как «вторая панель» действительно продвигается к решению? Кажется, он возвращается к одной и той же основной проблеме (только в другой панели). –

+0

@AndrewThompson, если его основной класс расширяет какой-то другой класс, он не может наследовать от JPanel, поэтому он может добавить новый пользовательский JPanel –

21

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

да вам придется расширить JPanel и переопределить функцию paintcomponent(Graphics g), чтобы сделать это.

@Override 
    protected void paintComponent(Graphics g) { 

    super.paintComponent(g); 
     g.drawImage(bgImage, 0, 0, null); 
} 

Я искал способ, чтобы просто добавить изображение, не создавая новый класс и в пределах того же метода (пытается держать вещи организованы и простые).

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

ImageIcon icon = new ImageIcon(imgURL); 
JLabel thumb = new JLabel(); 
thumb.setIcon(icon); 

Но опять-таки в кронштейне пытается держать вещи организованы и простые !! что заставляет вас думать, что просто создание нового класса приведет вас к беспорядочному миру?

12

Простейший способ установить изображение в качестве фона JPanel

Не используйте JPanel.Просто используйте JLabel с иконкой, тогда вам не нужен специальный код.

См Background Panel для получения дополнительной информации, а также решения, которое будет окрасить изображение на JPanel с 3-х различными вариантами окраски:

  1. масштабируется
  2. плиточного
  3. фактического
2

Рисовать изображение на фоне JPanel, которое добавляется к кадру. Используйте диспетчер компоновки, чтобы обычно добавлять кнопки и другие компоненты к панели. Если вы добавляете другие дочерние панели, возможно, вы хотите установить child.setOpaque (false).

import javax.imageio.ImageIO; 
import javax.swing.*; 
import java.awt.*; 
import java.io.IOException; 
import java.net.URL; 

public class BackgroundImageApp { 
    private JFrame frame; 

    private BackgroundImageApp create() { 
     frame = createFrame(); 
     frame.getContentPane().add(createContent()); 

     return this; 
    } 

    private JFrame createFrame() { 
     JFrame frame = new JFrame(getClass().getName()); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     return frame; 
    } 

    private void show() { 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private Component createContent() { 
     final Image image = requestImage(); 

     JPanel panel = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.drawImage(image, 0, 0, null); 
      } 
     }; 

     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
     for (String label : new String[]{"One", "Dois", "Drei", "Quatro", "Peace"}) { 
      JButton button = new JButton(label); 
      button.setAlignmentX(Component.CENTER_ALIGNMENT); 
      panel.add(Box.createRigidArea(new Dimension(15, 15))); 
      panel.add(button); 
     } 

     panel.setPreferredSize(new Dimension(500, 500)); 

     return panel; 
    } 

    private Image requestImage() { 
     Image image = null; 

     try { 
      image = ImageIO.read(new URL("http://www.johnlennon.com/wp-content/themes/jl/images/home-gallery/2.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return image; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new BackgroundImageApp().create().show(); 
      } 
     }); 
    } 
} 
Смежные вопросы