簡體   English   中英

盡管位置為0,0,但Jpanel的第一個項目中心

[英]Jpanel first item centers despite position of 0,0

我正在嘗試以編程方式為我正在處理的項目創建背景網格。 問題是我添加到jpanel的第一個項目總是繪制在jpanel的中心。 我明確地試圖把它放在右上角。 我甚至嘗試過先放下一個虛擬jlabel然后從那里開始,然后第二個和第三個元素相互重疊。 這個bug讓我徹底傻眼了。 任何幫助都會很棒。

 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);
        }
    }
}

樣本圖片:

https://i.stack.imgur.com/DlSgb.png

你沒有告訴我們變量“window”的類型,但我會假設它是一個JFrame或其他需要布局管理器的東西。 擺動窗口上的組件通常不會放置像0,0這樣的絕對位置; 它們被添加到設置為使用LayoutManager擴展的容器中,而LayoutManager類管理添加到其中的組件的位置。

FlowLayout按順序添加內容; GridLayout將相同大小的單元放在網格上; BorderLayout允許放置在5個區域中的一個區域等.LayoutManager方案可以避免在用戶更改外部窗口的大小時使用定位,允許某些元素隨可用的整體大小增長和縮小等。

如果你必須放置具有絕對位置的東西,那么有一個NullLayoutManager,但是在20多年的Java編程和許多不同的Swing應用程序中,我從未見過它。

閱讀LayoutManagers。 我確定你的窗口變量的默認值是將組件置於中心並忽略絕對位置。

正如其他地方所提到的, 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));
    }
}

這是效果:

在此輸入圖像描述

這是產生上述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 = "https://i.stack.imgur.com/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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM