我希望图像显示在网格顶部,但它们似乎被打包到不同的面板中。
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);
}
}
答案 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);
}