Java JComboBox会删除弹出的JComponent

Java JComboBox会删除弹出的JComponent,java,swing,jcombobox,jcomponent,Java,Swing,Jcombobox,Jcomponent,我正在编写一个程序,它的功能类似于绘画。看起来是这样的: 当我打开JComboBox(用于选择笔刷大小)时会发生错误。它似乎抹去了画在它下面的任何东西。 . 关闭JComboBox后,它看起来如下所示: 有没有关于是什么原因造成的,以及如何补救的想法 代码: 有两种常见的方式来做定制绘画。查看每种方法的示例: drawinimage示例显示如何使用BufferedImage的Graphics对象绘制BufferedImage DrawOnComponent示例显示了如何使用传递给组件的paint

我正在编写一个程序,它的功能类似于绘画。看起来是这样的:

当我打开JComboBox(用于选择笔刷大小)时会发生错误。它似乎抹去了画在它下面的任何东西。 . 关闭JComboBox后,它看起来如下所示:

有没有关于是什么原因造成的,以及如何补救的想法

代码:


有两种常见的方式来做定制绘画。查看每种方法的示例:

  • drawinimage
    示例显示如何使用
    BufferedImage
    Graphics
    对象绘制
    BufferedImage

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


  • 您使用的方法将取决于您的确切需求。

    如果没有代码,我们只能猜测。尝试删除程序中绘画和JComboBox以外的部分,以创建。(我的最佳猜测是,您的paintComponent方法没有像预期的那样调用
    super.paintComponent
    。@VGR建议的MCVE应该是我们可以复制/粘贴、编译和运行以查看问题的东西!因此,类似于
    Scanner in=new Scanner(新文件(“ColorButtons.txt”)不应包含在一个中。首先,这真的与问题有关吗?第二,如果有的话,这些。。颜色(?)应该在MCVE中硬编码。很抱歉,这违反了规定。我已将程序简化为一个MCVE1)
    私人图形抽屉不要尝试缓存
    图形
    实例。它们是暂时的。这就是代码中问题的根源。相反,将变量(如
    Color
    等)保留为类的属性,这些属性可以在一种方法中更改(例如,按下鼠标)并在另一种方法中访问(例如,绘制组件)。调用
    repaint()
    来调用重新绘制(它将向下流到绘制组件)。2) 提示:添加@VGR(或任何人,
    @
    很重要)以通知此人新的评论。如果要使用保存的图形对象进行绘制,请查看中的
    DrawOnImage
    示例,了解如何使用其图形对象绘制到
    BuffereImage
    。否则,所有自定义绘制都需要在paintComponent()方法中使用传递给该方法的图形对象。
    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) {}
    }