我有这个问题困扰了我好几天。我正在制作一个特殊的绘画程序。我制作了一个JPanel,并添加了使用paint(..)方法绘制的自定义jComponents。 问题是,无论何时调整窗口大小,所有添加的组件都“消失”(或者只是不画),所以我最终得到了一个空框架。调整添加的涂漆组件和奇怪的挥杆行为
另外我注意到使用这种方法时摆动的一些奇怪的行为。我已经向描述这个问题的代码添加了评论。
package simple;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class SimpleFrame extends JFrame {
JPanel paintArea;
SimpleCanvas c1;
SimpleCanvas c2;
ArrayList<SimpleCanvas> list;
public static void main(String[] args) {
SimpleFrame frame = new SimpleFrame();
}
public SimpleFrame() {
super("Test");
setSize(600,500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//The panel to which my SimpleCanvas objects are added
paintArea = new JPanel();
paintArea.setPreferredSize(new Dimension(600, 500));
paintArea.addMouseListener(new paintAreaMouseEvents());
getContentPane().add(paintArea, BorderLayout.CENTER);
setVisible(true);
paintArea.setVisible(true);
//A list to hold all the objects together
list = new ArrayList<SimpleCanvas>(10);
//The same as in class paintAreaMouseEvent, but doesnt work
SimpleCanvas c = new SimpleCanvas();
c.setBounds(60, 100, 100, 50);
list.add(c);
paintArea.add(list.get(list.size() - 1));
paintArea.repaint();
}
//When you click the mouse, it makes an oval
class paintAreaMouseEvents extends MouseAdapter {
@Override
//This does work.
public void mouseClicked (MouseEvent me) {
SimpleCanvas c = new SimpleCanvas();
c.setBounds(me.getX() - 50, me.getY() - 25, 100, 50);
list.add(c);
paintArea.add(list.get(list.size() - 1));
paintArea.repaint();
}
}
}
这里是SimpleCanvas类
package simple;
import java.awt.*;
import javax.swing.JComponent;
public class SimpleCanvas extends JComponent {
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.BLUE);
g.fillOval(0, 0, 100, 50);
}
}
谢谢:)
BTW:只想说这个网站是惊人的。我在使用Google的时候来过很多地方,现在我终于决定写一个账户。
非常感谢您!我向jPanel的构造函数中添加了null参数,并解决了我所有的问题。 我想我现在必须学习如何使用LayoutManagers;) 再次,谢谢。 – Charnia 2012-01-17 20:22:37
@Charnia:不客气。请参阅我的答案的附录。 – 2012-01-17 22:39:57
感谢您的提示,我一定会牢记在心。问题是我正在编写一个程序,该程序还允许您通过将另一个mouseEventHandler添加到自定义Canvas类来移动这些形状,因此您建议的方法将无法工作。 – Charnia 2012-01-18 18:20:11