图像在JFrame的是覆盖彼此不超过海誓山盟

问题描述:

public class Board extends JFrame 
{ 
    public void bd() 
{ 


    JFrame frame=new JFrame(); 
    JLabel background1 = new JLabel(new ImageIcon("background.png")); 
    JLabel knight=new JLabel(new ImageIcon("knight.jpg")); 
    frame.add(background1); 
    frame.add(knight); 
    frame.pack(); 
    frame.setResizable(false);  
    frame.setVisible(true); 





    } 
} 

我已经遇到一些麻烦我的代码图像在JFrame的是覆盖彼此不超过海誓山盟

当我加入骑士图像的背景图像将消失,仅出现在骑士图像显示两个图像。 我如何会使图像重叠或者使背景图像用作背景

+0

只是为了澄清的是,骑士的形象将是盈方background1图像 – thebigone

+0

@Andrew汤普森是否有可能打开这个问题吗?我有一些解决方案,这可能会有助于OP实际上想要做什么... – user3437460

+0

@ user3437460鉴于2个好答案,1个接受和重复状态,最好发布您的答案以回应新的(更具体的)你问的问题。 (就像我问/答复并用作重复的问答。) –

JLabel background1 = new JLabel(new ImageIcon("background.png")); 
JLabel knight=new JLabel(new ImageIcon("knight.jpg")); 
frame.add(background1); 
frame.add(knight); 

我猜你真正想要的是有顶部显示的骑士(在z轴),所以你需要做的是这样的:

JLabel background1 = new JLabel(new ImageIcon("background.png")); 
background.setLayout(new BorderLayout()); 
JLabel knight=new JLabel(new ImageIcon("knight.jpg")); 
background1.add(knight); 
frame.add(background1); 

这就是你需要遵循父/子层次:

  1. 添加背景框架
  2. 骑士增加背景
+0

只是为了澄清,如果我想要多个图像在层次结构的同一级别,我会将它们添加到background1.add(additionalIamgae)l – thebigone

+0

@thebigone ,是的,但是你会在背景标签上使用不同的布局管理器(也许是FlowLayout)。这是所有Swing组件的基础。他们遵循父母/子女关系。因此,无论何时您想在一个面板上使用多个组件,都可以将所有组件添加到同一个面板中。然后,布局管理器将根据布局管理器的规则安排组件。 – camickr

+0

您也可以查看[背景面板](https://tips4java.wordpress.com/2008/10/12/background-panel/),它可以更加灵活地绘制背景。 – camickr

JFrame使用BorderLayout默认的,这意味着只有一个图像在默认的/ CENTER位置进行管理。

查看How to Use Borders了解更多详情。

该解决方案实际上是困难的,因为你需要能够使该布局的大小,图像和董事会

你也许能够使用GridLayoutGridBagLayout担保,但你需要有“空的”填充组件,以使布局正确展开,这可能会带来麻烦

也许更好的解决方案可能是使用自定义绘画方法,它可以让您控制图像的放置位置。

Painting in AWT and SwingPerforming Custom Painting更多detals

下面的例子只是利用了GridBagLayout,它允许你覆盖组件(以各种不同的方式)。这个例子使boardLabel所有其他部分的容器,但是,由于方法GridBagLayout的作品,这不是绝对的要求

Chess

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Chess { 

    public static void main(String[] args) { 
     new Chess(); 
    } 

    public Chess() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        try { 
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
         ex.printStackTrace(); 
        } 

        JFrame frame = new JFrame("Testing"); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.add(new TestPane()); 
        frame.pack(); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() throws IOException { 
      BufferedImage board = ImageIO.read(getClass().getResource("/board.png")); 
      BufferedImage knight = ImageIO.read(getClass().getResource("/Knight.png")); 
      setLayout(new BorderLayout()); 
      JLabel boardLabel = new JLabel(new ImageIcon(board)); 
      add(boardLabel); 

      boardLabel.setLayout(new GridBagLayout()); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      for (int row = 0; row < 8; row++) { 
       gbc.gridy = row; 
       for (int col = 0; col < 8; col++) { 
        gbc.gridx = col; 
        boardLabel.add(filler(), gbc); 
       } 
      } 

      JLabel knightLabel = new JLabel(new ImageIcon(knight)); 

      gbc.gridx = 3; 
      gbc.gridy = 4; 
      boardLabel.add(knightLabel, gbc); 
     } 

     protected JComponent filler() { 
      JLabel filler = new JLabel() { 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(50, 50); 
       } 
      }; 
      return filler; 
     } 

    } 

} 

有了这样的设置,你可以简单地使用GridBagConstraintgridxgridy值作为直接单元地址(不需要计算像素位置)。

,因为布局管理器的工作方式,你需要提供一个空的电池组件以及