Итак, в основном я пишу программу, в которой пользователь щелкает и перетаскивает мышь до нужного ему размера и отпускает, заполняя прямоугольник в зависимости от выбора из JComboBox.
Я реализовал MouseListener и MouseMotionListener, чтобы отслеживать местоположение мыши и рисовать прямоугольник в зависимости от того, где пользователь впервые щелкнул, и куда он был отпущен.
Когда пользователь щелкает и перетаскивает (но не отпускает), есть drawRect (), но не fillRect () (как в случае, прямоугольник не заполняется - только когда пользователь отпускает мышь, заливка прямоугольника с цветом).
Этот класс создает объект Rect, который имеет другую часть в конструкторе, то есть цвет, который выбран (который определяется в классе ColorListener ниже).
Здесь я включил переменные своего экземпляра, и все создается в конструкторе ниже:
private ArrayList<Rect> rectList;
private Color currentColor;
private Canvas canvas;
private JPanel controlPanel;
private JButton undo, erase;
private JComboBox comboBox;
private int xStart, yStart, xEnd, yEnd;
private Graphics page;
private Point pt = null;
private PointListener pointListener;
private ColorListener colorListener;
public WholePanel()
{
// here we use black to draw a rectangle
currentColor = Color.black;
pointListener = new PointListener();
addMouseListener(pointListener);
addMouseMotionListener(pointListener);
String[] listOfColors = {"black", "red", "blue", "green", "orange"};
comboBox = new JComboBox(listOfColors);
comboBox.setSelectedIndex(0);
rectList = new ArrayList<Rect>();
controlPanel = new JPanel(new GridLayout(1,3));
undo = new JButton("Undo");
erase = new JButton("Erase");
controlPanel.add(comboBox);
controlPanel.add(undo);
controlPanel.add(erase);
undo.addActionListener(new ButtonListener());
erase.addActionListener(new ButtonListener());
canvas = new Canvas();
JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, controlPanel, canvas);
setLayout(new BorderLayout());
add(sp);
}
Класс Rect может создать объект Rect, используемый позже.
public class Rect
{
private int x1, y1, width1, height1;
private Color color1;
public Rect(int x, int y, int width, int height, Color color)
{
x1 = x;
y1 = y;
width1 = width;
height1 = height;
color1 = color;
}
public void draw(Graphics page)
{
page.setColor(color1);
page.drawRect(x1,y1,width1,height1);
}
}
Класс Canvas создает пространство, которое позволяет рисовать объект.
private class Canvas extends JPanel
{
public void paintComponent(Graphics page)
{
super.paintComponent(page);
setBackground(Color.white);
if (pt != null)
{
Rect rect = new Rect(xStart, yStart, xEnd-xStart, yEnd-yStart, currentColor);
rect.draw(page);
}
}
}
Класс PointListener находит все точки, которые находятся там, например, куда пользователь нажимает, куда пользователь перетаскивает, а также куда пользователь отпускает.
private class PointListener implements MouseListener, MouseMotionListener
{
public void mousePressed(MouseEvent event)
{
pt = event.getPoint();
xStart = pt.x;
yStart = pt.y;
}
public void mouseReleased(MouseEvent event)
{
pt = event.getPoint();
if (pt != null)
{
xEnd = pt.x;
yEnd = pt.y;
page.fillRect(xStart, yStart, xEnd-xStart, yEnd-yStart);
}
}
public void mouseClicked(MouseEvent event) {}
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {}
public void mouseDragged(MouseEvent event)
{
pt = event.getPoint();
if (pt != null)
{
xEnd = pt.x;
yEnd = pt.y;
Rect rect = new Rect(xStart, yStart, xEnd-xStart, yEnd-yStart, currentColor);
rect.draw(page);
}
repaint();
}
public void mouseMoved(MouseEvent event) {}
}
ColorListener находит тип объекта, который выбран в JComboBox, определенный в методе main (), и устанавливает ему значение currentColor (оно возвращается в качестве цвета в конструкторе Rect выше).
private class ColorListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
if (event.getSource().equals("black"))
{
currentColor = Color.black;
comboBox.setSelectedIndex(0);
}
else if (event.getSource().equals("red"))
{
currentColor = Color.red;
comboBox.setSelectedIndex(1);
}
else if (event.getSource().equals("blue"))
{
currentColor = Color.blue;
comboBox.setSelectedIndex(2);
}
else if (event.getSource().equals("green"))
{
currentColor = Color.green;
comboBox.setSelectedIndex(3);
}
else if (event.getSource().equals("orange"))
{
currentColor = Color.orange;
comboBox.setSelectedIndex(4);
}
}
}
Так что у меня возникли проблемы с возможностью нарисовать это. Я не вижу никаких недостатков в логике в программе выше, и ничто не может быть нарисовано на холсте (не беспокойтесь о JButtons Undo и Erase, так как с ними легко работать с ArrayList и remove () и clear () и тому подобное).