gpt4 book ai didi

java - JComponent.setBounds 最后一个 JComponent 在错误的地方

转载 作者:行者123 更新时间:2023-11-30 06:30:49 25 4
gpt4 key购买 nike

最近我在使用 Swing 时遇到了一些问题。我正在尝试快速制作下图所示的内容,以说明算法的数据结构。

notebook image
(来源:ius.edu)

我在接下来的类(class)中尝试做的就是画出一些带有数字的矩形。并翻译它们,但是最后一个矩形绘制在 0,0 处。我很难过。

如果您在循环之后添加 JPanel(注释掉),那么它会按预期进行绘制。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DrawingRect {

public static void main(String[] args) {
DrawingRect d = new DrawingRect();
}

public DrawingRect() {

JFrame frame = new JFrame("Drawing a rect");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel swingPanel = new JPanel();
swingPanel.setPreferredSize(new Dimension(500, 500));

swingPanel.setVisible(true);

swingPanel.setLayout(new BorderLayout(0, 0));

int base = 15;
for (int i = 1; i <= 25; i++) {
Graphic re = new Graphic(i);

//translating the graphic
re.setBounds(base + 30 * i, base + 20 * i, 110, 110);


swingPanel.add(re);
}


// if say I add a JPanel in here as the last element
// then the boxes will draw correctly.
//swingPanel.add(new JPanel());

swingPanel.setPreferredSize(new Dimension(800, 600));

frame.getContentPane().add(swingPanel);

frame.pack();
frame.setVisible(true);
}

public class Graphic extends JComponent {

private static final long serialVersionUID = 1L;
private static final int PREF_W = 100;
private static final int PREF_H = 100;
int id;

public Graphic(int id) {
this.id = id;
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.black);

g2.setColor(Color.black);
g2.drawRoundRect(0, 0, 30, 30, 20, 20);

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

Font font = new Font("", Font.PLAIN, 13);
g2.setFont(font);

g2.drawString("" + id, 15, 20);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
}
}

最佳答案

默认layout JPanel 的是 FlowLayout,但您定位组件时就好像布局是 null 一样。此外,您正在绘制嵌套组件可以自动执行的内容。

相反,将多个包含 JLabelJPanel 添加到具有 GridLayout 的包含面板。根据需要使用空面板。覆盖外部面板中的 paintComponent() 以绘制连接线。

附录:任何时候有人想使用 Absolute Positioning , JInternalFrame可能是另一种选择。可以找到相关示例herehere .

附录:如果项目超出原型(prototype)阶段,还要考虑 Custom Layout Manager .

关于java - JComponent.setBounds 最后一个 JComponent 在错误的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10147912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com