JComboBox 擦除它在其上弹出的 JComponent

JComboBox erases the JComponent over which it pops up

我正在开发一个功能类似于画图的程序。它看起来像这样:program

打开JComboBox(习惯select画笔大小)时出现错误。它似乎擦掉了它下面画的任何东西。 JComboBox opened. After closing the JComboBox it looks like this: JComboBox closed

关于可能导致此问题的原因以及如何补救的任何想法?

代码:

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) {}
}

有两种常见的自定义绘画方式。查看 Custom Painting Approaches 以获取每种方法的示例:

  1. DrawOnImage 示例显示了如何使用 BufferedImageGraphics 对象绘制到 BufferedImage

  2. DrawOnComponent示例显示了如何使用传递给组件的paintComponent(...)方法的Graphics对象。

您使用的方法将取决于您的具体要求。