java - Jpanel 第一项居中,尽管位置为 0,0

标签 java swing jpanel layout-manager

我正在尝试以编程方式为我正在处理的项目创建背景网格。问题是我添加到 jpanel 的第一个项目总是画在 jpanel 的中心。我明确试图把它放在右上角。我什至尝试过先放置一个虚拟 jlabel 然后从那里开始,但是第二个和第三个元素只是相互重叠。这个错误让我彻底傻眼了。任何帮助都会很棒。

 private void evalWindow(){
    window.removeAll();
    window.setBorder(BorderFactory.createLineBorder(Color.black));
    JLabel p = new JLabel(new ImageIcon(tiles[0][0].getImage()));
    p.setLocation(0,0);

    System.out.println("1: " + p.getLocation());
    p.setSize(64,64);
    window.add(p);
    System.out.println("2: " + p.getLocation());
    for(int i = 0; i < x; i++){
        for (int j = 0; j  < y; j++){
            JLabel piclabel = new JLabel(new ImageIcon(tiles[i][j].getImage()));
            piclabel.setSize(64,64);
            piclabel.setLocation(64*j, 64*i);

            System.out.println("1: " + piclabel.getLocation());
            window.add(piclabel);
        }
    }
}

示例图片:

/image/DlSgb.png

最佳答案

如其他地方所述,GridLayout 是布局网格位置的最简单方法。它可以很简单:

public void initUI(Image img) {
    ui = new JPanel(new GridLayout(0,8));

    ImageIcon icon = new ImageIcon(img);
    for (int ii=0; ii<32; ii++) {
        ui.add(new JLabel(icon));
    }
}

效果是这样的:

enter image description here

这是生成上述 GUI 的 MCVE。以后请以MVCE的形式贴出代码。

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

public class ImageGrid {

    private JComponent ui = null;
    String imageURL = "/image/DlSgb.png";

    ImageGrid() {
        try {
            BufferedImage img = ImageIO.read(new URL(imageURL));
            BufferedImage subImg = img.getSubimage(2, 2, 64, 64);
            initUI(subImg);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    final public void initUI(Image img) {
        ui = new JPanel(new GridLayout(0,8));

        ImageIcon icon = new ImageIcon(img);
        for (int ii=0; ii<32; ii++) {
            ui.add(new JLabel(icon));
        }
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception useDefault) {
            }
            ImageGrid o = new ImageGrid();

            JFrame f = new JFrame(o.getClass().getSimpleName());
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);

            f.setContentPane(o.getUI());
            f.pack();
            f.setMinimumSize(f.getSize());

            f.setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}

关于java - Jpanel 第一项居中,尽管位置为 0,0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48847725/

相关文章:

java - 在phonegap应用程序中调用应用程序引擎API

java - 更改卡片布局中面板的背景和大小

java - 为什么在java中加载类时委托(delegate)

java - 为什么 break 不结束 while 循环?

java - 复选框节点树

java - 如何使用 Netbeans 将 jpanel 置于 jpanel 的中心?

Java drawString 正在绘制超出范围的字符串

java - 这段代码有什么问题? (JScrollPane 和 JFrame)

java - 无法使 jTable 不可见

swing - Java-读取复选框是否被选中