0
因此,我創建了一個程序,允許用戶在JPanel上繪製多個形狀,類似於繪畫程序。問題是,當我嘗試向存儲所有形狀的ArrayList添加一行,然後在JPanel上重新繪製它們時,該行將被存儲但不會重繪。JPanel上沒有重繪線條
因此,例如,假設我從頂部的JMenu中選擇了線工具。然後,我點擊並拖動,並且從我點擊鼠標到當前位置的位置出現該線。我釋放鼠標,線路仍然存在。當我去繪製另一條線時,點擊並拖動,第一條線鬆開鼠標後消失。我怎樣才能得到它,這樣該行將保留在JPanel上?
import ...
public class GraphicsTest {
public GraphicsTest() {
JFrame frame = new JFrame("");
Painter painter = new Painter();
frame.setLayout(new BorderLayout());
// frame.setJMenuBar(painter.createMenuBar());
frame.add(painter,BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(750,488);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new GraphicsTest();
}
});
}
public class Painter extends JPanel implements MouseListener, MouseMotionListener {
private java.awt.geom.Line2D.Double line = new java.awt.geom.Line2D.Double();
private List<Shape> shapeList = new ArrayList<Shape>();
private List<Integer> opNumList = new ArrayList<Integer>();
// Initial color
private Color color = Color.black;
// int variables that determine the position of various on-screen objects
private int dragX = 0, dragY = 0, downX = 0, downY = 0, upX = 0, upY = 0;
// Fields that determine which tool should be used
private int PEN = 0, LINE = 1, RECTANGLE = 2, OVAL = 3;
// Initial tool used
private int toolNum = LINE;
private Point clickPoint, releasePoint;
/**
* Sole and default constructor of this class
**/
public Painter() {
// Adding listeners so that the mouse may be used to draw various objects
addMouseListener(this);
addMouseMotionListener(this);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int index = 0;
Graphics2D g2 = (Graphics2D) g.create();
g2.setColor(color);
if (toolNum == LINE) {
g2.draw(new java.awt.geom.Line2D.Double(downX,downY,dragX,dragY));
}
System.out.println("Size: " + shapeList.size());
if (!opNumList.isEmpty()) {
for (Shape s : shapeList) {
// System.out.println("Index: " + index);
// System.out.println("Element: " + opNumList.get(index));
// System.out.println(s);
System.out.println();
switch (opNumList.get(index)) {
case 41: g2.setColor(Color.black); g2.draw(s); break;
default: return;
}
index++;
}
}
}
/**
* MouseListener interface methods
**/
@Override
public void mouseClicked(MouseEvent ev) {}
@Override
public void mouseEntered(MouseEvent ev) {}
@Override
public void mouseExited(MouseEvent ev) {}
@Override
public void mousePressed(MouseEvent ev) {
clickPoint = new Point(ev.getPoint());
upX = ev.getX();
upY = ev.getY();
downX = ev.getX();
downY = ev.getY();
}
@Override
public void mouseReleased(MouseEvent ev) {
upX = ev.getX();
upY = ev.getY();
releasePoint = new Point(ev.getPoint());
line.x1 = clickPoint.x;
line.y1 = clickPoint.y;
line.x2 = releasePoint.x;
line.y2 = releasePoint.y;
if (toolNum == LINE)
shapeList.add(line);
if (color == Color.black) {
if (toolNum == LINE)
opNumList.add(41);
}
repaint();
}
/**
* MouseMotionListener interface methods
**/
@Override
public void mouseMoved(MouseEvent ev) {}
@Override
public void mouseDragged(MouseEvent ev) {
dragX = ev.getX();
dragY = ev.getY();
repaint();
}
}
}
有趣......我沒想到我會被添加在同一行對象的全部時間和修改其端點的只是座標。謝謝! – TNT 2014-10-28 23:23:22
很高興幫助.... – MadProgrammer 2014-10-28 23:44:51