我花了几天时间试图让Graphics2D类在我的代码中运行。我的结构是这样的,当一个click事件被注册时,重新调用的调用就完成了,但是当它到达调用repaint()的阶段时,它只产生一个nullpointer异常。
调试时所有工作正常,而不是在paintComponent方法中调用,但是当尝试使用paintComponent和repaint()正确调用代码以允许Graphics2D类显示每个点的行时,它不起作用
我已经包含了我的代码部分,我很难开始工作。任何帮助都将非常感激。提前谢谢。
以下是包含mouseListener的GUI类。
public class GUI extends JPanel implements MouseListener {
private JLabel label;
public BufferedImage getImg() {
return img;
}
public void mouseClicked(java.awt.event.MouseEvent e) {
// TODO Auto-generated method stub
label = new JLabel();
//set point equal to the location of the mouse click on the image label
Point b = e.getPoint();
//place we are going to print the dots
segmentation.x = b.x; //gets the x coordinate
segmentation.y = b.y; //gets the y coordinate
System.out.println("x = " + segmentation.x);
System.out.println("y = " + segmentation.y);
//set the global img in the segmentation class equal to that of the one in the current tab
segmentation.setImg(tabbedPane.getSelectedIndex(), getImg());
segmentation.paintUpdate();
label = segmentation.getLabel();
//if i run this line of code the existing label I already have with simply vanish because of the paintComponent method not being called upon properly.
//tabbedPane.setComponentAt(tabbedPane.getSelectedIndex(), label);
}
这是Segmentation类,它包含我无法正确调用的paintComponent方法。
public class Segmentation extends JLabel {
public int[] xpoints = new int[50];
public int[] ypoints = new int[50];
private int npoints = 0;
public int x;
public int y;
GeneralPath polyline;
Graphics2D g2;
JLabel label;
BufferedImage img;
ImageIcon icon;
public void paintUpdate() {
repaint();
}
public void setImg(int tabNum, BufferedImage img) {
this.img = img;
}
public GeneralPath createPath() {
// if (npoints > 0) {
polyline.moveTo(xpoints[0], ypoints[0]);
for(int i = 1; i < xpoints.length; i++) {
//add the position of the point to the respective x and y arrays
polyline.lineTo(xpoints[i], ypoints[i]);
}
// }
return polyline;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("we're in the paint component method");
//set up for the new jlabel
label = new JLabel();
label.setIcon(new javax.swing.ImageIcon(img));
label.setHorizontalAlignment(JLabel.LEFT);
label.setVerticalAlignment(JLabel.TOP);
//add the position of the point to the respective x and y arrays
xpoints[npoints] = x;
ypoints[npoints] = y;
if (npoints == 0) {
JOptionPane.showMessageDialog(null, "Your first point has been added successfully");
}
else {
JOptionPane.showMessageDialog(null, "Your " + npoints + " rd/th" + " point has been added successfully");
}
polyline = createPath();
// Draws the buffered image to the screen.
g2.drawImage(img, 0, 0, this);
g2.draw(polyline);
npoints++;
}
答案 0 :(得分:6)
您的Segmentation类有两个JLabel,一个是类本身的对象,它有一个paintComponent覆盖,很可能永远不会使用:
public class Segmentation extends JLabel {
另一个叫做标签的JLabel,它由类中的组合保存,它没有实际使用的方法覆盖,并且似乎是“遮蔽”类的实例:
JLabel label
如果要调用paintComponent,则需要使用实际上覆盖该方法的标签对象。
您似乎也在paintComponent(...)
方法中创建组件(??)。从来没有这样做,也没有这种方法中的程序逻辑。
编辑:
要绘制图像,我通常会覆盖paintComponent并使用Graphics / Graphics2D对象进行绘制。例如:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.*;
public class DrawOnLabel extends JLabel {
public static final String GIRAFFE_IMG_URL = "http://upload.wikimedia.org/wikipedia/commons/thumb" +
"/9/9e/Giraffe_Mikumi_National_Park.jpg/474px-Giraffe_Mikumi_National_Park.jpg";
private static final Color LINES_COLOR = Color.red;
private static final Color CURRENT_LINE_COLOR = new Color(255, 200, 200);
private List<Line2D> lineList = new ArrayList<Line2D>();
private Line2D currentLine = null;
public DrawOnLabel() throws IOException {
URL giraffeUrl = new URL(GIRAFFE_IMG_URL);
BufferedImage img = ImageIO.read(giraffeUrl);
ImageIcon icon = new ImageIcon(img);
setIcon(icon);
MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
addMouseListener(myMouseAdapter);
addMouseMotionListener(myMouseAdapter);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(LINES_COLOR);
for (Line2D line : lineList) {
g2.draw(line);
}
if (currentLine != null) {
g2.setColor(CURRENT_LINE_COLOR);
g2.draw(currentLine);
}
}
private class MyMouseAdapter extends MouseAdapter {
Point p1 = null;
@Override
public void mousePressed(MouseEvent e) {
p1 = e.getPoint();
}
@Override
public void mouseReleased(MouseEvent e) {
if (currentLine != null) {
currentLine = new Line2D.Double(p1, e.getPoint());
lineList.add(currentLine);
currentLine = null;
p1 = null;
repaint();
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (p1 != null) {
currentLine = new Line2D.Double(p1, e.getPoint());
repaint();
}
}
}
private static void createAndShowGui() {
DrawOnLabel mainPanel = null;
try {
mainPanel = new DrawOnLabel();
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
JFrame frame = new JFrame("DrawOnLabel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.setResizable(false);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}