Jpanel 第一项居中,尽管位置为 0,0
Jpanel first item centers despite position of 0,0
我正在尝试以编程方式为我正在处理的项目创建背景网格。问题是我添加到 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);
}
}
}
示例图片:
您没有告诉我们变量的类型 "window",但我假设它是 JFrame 或其他需要布局管理器的东西。 Swing windows 上的组件通常不会放置在像 0,0 这样的绝对位置;它们被添加到设置为使用 LayoutManager 扩展的容器中,LayoutManager class 管理添加到其中的组件的去向。
FlowLayout 按顺序添加东西; GridLayout 将内容放在网格的 equal-size 个单元格中; BorderLayout 允许放置在 5 个区域之一等。LayoutManager 方案使您不必在用户更改外部 window 的大小时进行定位,允许某些元素随着可用的整体大小而增长和缩小等.
如果你必须用绝对位置放置东西,有一个 NullLayoutManager,但在 20 多年的 Java 编程和许多不同的 Swing 应用程序中,我从未见过一个。
了解布局管理器。我确定您的 window 变量的默认设置是将您的组件放在中心并忽略绝对位置。
如其他地方所述,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。以后请post以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);
}
}
我正在尝试以编程方式为我正在处理的项目创建背景网格。问题是我添加到 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);
}
}
}
示例图片:
您没有告诉我们变量的类型 "window",但我假设它是 JFrame 或其他需要布局管理器的东西。 Swing windows 上的组件通常不会放置在像 0,0 这样的绝对位置;它们被添加到设置为使用 LayoutManager 扩展的容器中,LayoutManager class 管理添加到其中的组件的去向。
FlowLayout 按顺序添加东西; GridLayout 将内容放在网格的 equal-size 个单元格中; BorderLayout 允许放置在 5 个区域之一等。LayoutManager 方案使您不必在用户更改外部 window 的大小时进行定位,允许某些元素随着可用的整体大小而增长和缩小等.
如果你必须用绝对位置放置东西,有一个 NullLayoutManager,但在 20 多年的 Java 编程和许多不同的 Swing 应用程序中,我从未见过一个。
了解布局管理器。我确定您的 window 变量的默认设置是将您的组件放在中心并忽略绝对位置。
如其他地方所述,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。以后请post以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);
}
}