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 以获取每种方法的示例:
DrawOnImage
示例显示了如何使用 BufferedImage
的 Graphics
对象绘制到 BufferedImage
。
DrawOnComponent
示例显示了如何使用传递给组件的paintComponent(...)
方法的Graphics
对象。
您使用的方法将取决于您的具体要求。
我正在开发一个功能类似于画图的程序。它看起来像这样: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 以获取每种方法的示例:
DrawOnImage
示例显示了如何使用BufferedImage
的Graphics
对象绘制到BufferedImage
。DrawOnComponent
示例显示了如何使用传递给组件的paintComponent(...)
方法的Graphics
对象。
您使用的方法将取决于您的具体要求。