如何使用Java GUI面板?

时间:2010-11-04 06:16:26

标签: java

我希望图像显示在网格顶部,但它们似乎被打包到不同的面板中。

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class test4 extends JPanel {

BufferedImage image;
Dimension size = new Dimension();

public test4(BufferedImage image) {
    this.image = image;

JPanel content = new JPanel(new GridLayout(8,8)); 

for (int i = 0; i < 8*8; ++i) { 
    JPanel panel = new JPanel(); 

    if ( i % 2 == i/8 % 2) {
        panel.setBackground(Color.WHITE); 
    } else {
        panel.setBackground(Color.DARK_GRAY); 
    }
        content.add(panel); 
    } 
        this.add(content); 
    }

protected void paintComponent(Graphics g) {
    int x = 100;
    int y = 300;
    g.drawImage(image, x, y, this);
}

public static void main(String[] args) throws IOException {
String path = "images/Untitled.png";
BufferedImage image = ImageIO.read(new File(path));

test4 test = new test4(image);
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_O…
    f.add(test);
    f.setSize(400,400);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:2)

  然而,它们似乎被包装到不同的面板中。

这是因为默认情况下JPanel使用FlowLayout。 FlowLayout尊重添加到其中的任何组件的大小。空JPanel默认大小为10 X 10,这是FlowLayout的默认水平/垂直间隙。因此,您的棋盘在面板顶部以其首选大小为中心。

您可以通过添加以下内容轻松解决此问题:

setLayout( new BorderLayout() );
  

我想让图像显示在网格顶部

这对我没有任何意义?你为什么要在国际象棋棋盘上画一幅画?

如果您想要国际象棋棋子,请创建一个JLabel并将标签添加到各个国际象棋方块中。

如果您想在游戏开始时显示图像,请使用模态JDialog在JLabel中显示图像。

如果你想更好地理解绘画,那么通常你会覆盖paintComponent来绘制图像。然而,在这种情况下,图像将被绘制,然后国际象棋面板将被绘制在图像的顶部,所以你永远不会看到图像。

如前所述,正确的方法是使用分层窗格,但仍可以通过覆盖面板的paint()方法来完成:

public void paint(Graphics g)
{
    super.paint(g);
    int x = 50;
    int y = 50;
    g.drawImage(image, x, y, this);
}

要了解其工作原理,请阅读Understanding the Paint Mechanism上的Swing教程中的部分。现在您应该看到在绘制子组件之后绘制了图像。

答案 1 :(得分:0)

不是创建这么多面板,而是在循环中使用graphics.fillRect绘制网格会更有效。像这样:

public void paint(Graphics g){
    int x = 0 ;
    int y = 0 ;
    g.setColor(Color.WHITE);
    while (y <= getHeight()) {
        //flip the color
        g.setColor(g.getColor() == Color.WHITE ? Color.DARK_GRAY : Color.WHITE);

        g.fillRect(x, y, 8, 8);

        x += 8;
        if (x >= getWidth()) {
            x = 0;
            y += 8;
        }
    }

    //now the image
    int xi = 100;
    int yi = 300;
    g.drawImage(image, xi, yi, this);
}