我最近遇到了Swing的一些问题。我正在尝试制作类似于下图中的内容,以说明算法的数据结构。
notebook image http://homepages.ius.edu/rwisman/C201/html/ch4-2.jpg
我在下面的课程中尝试做的所有事情都是画出一些带有数字的矩形。并翻译它们,但最后一个矩形绘制为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);
}
}
}
答案 0 :(得分:3)
JPanel
的默认layout为FlowLayout
,但您正在定位组件,就像布局为null
一样。此外,您正在绘制嵌套组件可以自动执行的内容。
相反,请将包含JPanel
的多个JLabel
添加到包含GridLayout
的面板中。根据需要使用空面板。覆盖外部面板中的paintComponent()
以绘制连接线。
附录:每当有人试图使用Absolute Positioning时,JInternalFrame
可能是另一种选择。可以找到相关示例here和here。
附录:如果项目超出原型阶段,还要考虑Custom Layout Manager。
答案 1 :(得分:2)
这是因为你正在使用BorderLayout。您可以通过更改添加行来测试此项,以包含特定的布局位置:swingPanel.add(re,BorderLayout.SOUTH)
。
至于解决方案,为什么不在图片上绘制所有矩形并在循环结束时更新它?或者是在演示中添加JPanel部分?