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