2016-10-30 11 views
0

Я создаю программу стиля рисования мс для задания домашней работы. В этом домашнем задании вы должны иметь право щелкнуть правой кнопкой мыши по фигуре и переместить ее вокруг экрана. Заполненные фигуры можно щелкнуть правой кнопкой мыши в любом месте формы, где, когда незаполненные фигуры следует щелкнуть правой кнопкой мыши и выбрать их на границе формы.Перетаскивание заполненных фигур против незаполненных фигур [Домашнее задание]

Проблема, с которой я сталкиваюсь, заключается в том, что когда я изначально запускаю программу, рисую и не заполненную фигуру, и пытаюсь ее перетащить, она будет перетаскиваться, но как только я ее сброшу снова, она будет вести себя корректно и станет неуправляемой, а все будущие незаполненные формы действуют соответственно.

TLDR: Я хочу, чтобы все заполненные фигуры были перетаскиваемыми, а все незаполненные фигуры были неразборчивыми. Незаполненные фигуры (по какой-то причине) ARE перетаскиваются, если это первая форма. После того, как незаполненная фигура перетаскивается один раз, она ведет себя правильно.

Вот соответствующий код:

private boolean isFilled = false; 
private JCheckBox fill = new JCheckBox("Filled"); 
private int indexToMove; 

компонент краски

public void paintComponent(Graphics g) { 
super.paintComponent(g); 
g.setColor(Color.WHITE); 
g.clearRect(0, 0, getWidth(), getHeight()); 

for (int i = 0; i < shapes.size(); i++) { 
    shapes.get(i).draw(g); 
} 

repaint(); 

} 

ActionPerformed на моей кнопки заполнения

else if (e.getSource() == fill) { 
    if (fill.isSelected()) { 
    isFilled = true; 
    } else { 
    isFilled = false; 
    } 
} 

ЭТО ЧАСТЬ ГДЕ НАЧАТЬ перетаскиванием

MOUSE ПРЕССОВАННОГО

public void mousePressed(MouseEvent e) { 

if (SwingUtilities.isRightMouseButton(e)) { 
    for (int i = 0; i < shapes.size(); i++) { 
    if (shapes.get(i).isSelected(e.getX(), e.getY())) { 
     System.out.println("Shape contained in: " + i); 
     indexToMove = i; 
    } 
    } 
} 
} 

MOUSE тащил

public void mouseDragged(MouseEvent e) { 

if (SwingUtilities.isRightMouseButton(e)) { 
    if (indexToMove >= 0) { 
    shapes.get(indexToMove).move(e.getX(), e.getY()); 
    } 
} 
} 

MOUSE RELEASED

public void mouseReleased(MouseEvent e) { 
if (SwingUtilities.isRightMouseButton(e)) { 
    indexToMove = -1; 
} 
} 

ВОТ СВЯЗАННОГО SHAPE КЛАССА КОД

public class MyRectangle extends Rectangle implements MyShape { 
private Color color; 
private boolean filled = false; 
private int x, y, dx, dy, height, width; 

public MyRectangle(Color color, boolean filled, int x, int y, int endX, int endY) { 
this.color = color; 
this.filled = filled; 
this.x = x; 
this.y = y; 
this.dx = endX; 
this.dy = endY; 

} 

@Override 
public void draw(Graphics g) { 

... 

if (!filled) { 

    g.drawRect(x, y, width, height); 
} 

if (filled) { 
    g.fillRect(x, y, width, height); 
} 
} 

это где я проверить, если он FILLED/UNF Ыть убитым СИСТЕМНЫЙ только ПРОИСХОДИТ ПОСЛЕ тянуться и понизиться незаполненных ФОРМЕ ОДИН РАЗ

@Override 
public boolean isSelected(int clickX, int clickY) { 
boolean selected = false; 
if(filled == false){ 
    System.out.println("unfilled shape, do not move"); 
    selected = false; 
} 

else if (filled == true) { 
    if ((clickX > x) && (clickX < dx) && (clickY > y) && (clickY < dy)) { 

    selected = true; 
    } else { 
    selected = false; 
    } 
} 


return selected; 
} 


public void move(int offsetX, int offsetY) { 

int centerX = (dx + x)/2; 
int centerY = (dy + y)/2; 
System.out.println("CenterX: " + centerX + " CenterY: " + centerY); 

if (offsetX > centerX) { 

    offsetX = offsetX - centerX; 
    x += offsetX; 
    dx += offsetX; 
} else if (offsetX < centerX) { 

    offsetX = centerX - offsetX; 
    x -= offsetX; 
    dx -= offsetX; 
} 

if (offsetY > centerY) { 

    offsetY = offsetY - centerY; 

    y += offsetY; 
    dy += offsetY; 
} 

else if (offsetY < centerY) { 

    offsetY = centerY - offsetY; 
    y -= offsetY; 
    dy -= offsetY; 
} 

} 

знаю, что это совсем немного кода, я пытался рубить что-нибудь, что не кажется уместным. Дайте мне знать, если вам нужно увидеть больше!

ответ

0

Ответил на мой вопрос.

Когда вы щелкаете правой кнопкой мыши, индексToMove не был назначен ни на что, там, пока он не будет перемещен, он зарегистрируется, что он не должен перемещаться.

Я дал indexToMove значение -1, поэтому при запуске форма не будет перетаскиваться.