JComboBox стирает JComponent, над которым он появляется - PullRequest
0 голосов
/ 05 марта 2019

Я работаю над программой, которая будет работать аналогично Paint.Это выглядит так: программа

Ошибка возникает при открытии JComboBox (используется для выбора размера кисти).Кажется, стереть все, что было нарисовано под ним. JComboBox открыт .После закрытия JComboBox это выглядит так: JComboBox закрыто

Есть идеи, что может быть причиной и как это исправить?

Код:

import javax.swing.*;
import java.awt.*;
import java.util.Scanner;
import java.io.File;
import java.io.IOException;
import java.awt.event.*;


public class Paint extends JFrame implements ActionListener {
    private JPanel topBar;
    private JComboBox<String> brushSizes;
    private DrawArea drawArea;

    public Paint() throws IOException {
        setTitle("Paint");
        setSize(500,500);
        setLayout(new BorderLayout());
        drawArea = new DrawArea();
        topBar = new JPanel(new FlowLayout());
        String[] sizes = {"1", "2", "3", "5", "8", "10", "25", "50", "100"};
        brushSizes = new JComboBox<String>(sizes);
        brushSizes.setSelectedIndex(0);
        brushSizes.setActionCommand("BrushSize");
        brushSizes.addActionListener(this);
        topBar.add(brushSizes);
        add(topBar, BorderLayout.NORTH);
        add(drawArea, BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent event) {
        String command = event.getActionCommand();
        if (command.equals("BrushSize")) {
            drawArea.setBrushStroke(Integer.parseInt((String)brushSizes.getSelectedItem()));
        }
    }

    public static void main(String[] args) throws IOException {
        Paint paint = new Paint();
    }
}

Подробнее код:

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class DrawArea extends JComponent implements MouseMotionListener,     MouseListener {
    private Color currentColor;
    private boolean dragging;
    private int toX;
    private int toY;
    private int brushSize;
    private Graphics drawer;

    public DrawArea() {
        currentColor = Color.BLACK;
        dragging = false;
        addMouseListener(this);
        addMouseMotionListener(this);
        toX = -1;
        toY = -1;
        brushSize = 1;
        repaint();
    }

    public void setBrushStroke(int size) {
        brushSize = size;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.WHITE);
        g.fillRect(0,0,1000,1000);
        g.setColor(currentColor);
    }

    public void mousePressed(MouseEvent event) {
        dragging = true;
        toX = event.getX();
        toY = event.getY();
        drawer = getGraphics();
        drawer.setColor(currentColor);
    }

    public void mouseReleased(MouseEvent event) {
        dragging = false;
        drawer.dispose();
        drawer = null;
    }

    public void mouseDragged(MouseEvent event) {
        if (dragging) {
            int x = event.getX();
            int y = event.getY();

            Graphics2D drawerTo = (Graphics2D) drawer;
            drawerTo.setStroke(new BasicStroke(brushSize));
            drawerTo.drawLine(toX, toY, x, y);
            toX = x;
            toY = y;
        }
    }

    public void mouseClicked(MouseEvent event) {}
    public void mouseEntered(MouseEvent event) {}
    public void mouseExited(MouseEvent event) {}

    public void mouseMoved(MouseEvent event) {}
}

1 Ответ

0 голосов
/ 06 марта 2019

Существует два распространенных способа рисования на заказ.Посмотрите Пользовательские подходы к рисованию для примеров каждого подхода:

  1. В примере DrawOnImage показано, как рисовать в BufferedImage с использованием объекта GraphicsBufferedImage.

  2. В примере DrawOnComponent показано, как использовать объект Graphics, переданный методу paintComponent(...) компонента.

Подход, который вы используете, будет зависеть от ваших точных требований.

...