У меня есть этот код, который предназначен для рисования прямоугольника поверх предварительно загруженного изображения, но он не работает.
Когда я добавляю класс рисования во фрейм, он перезаписывает изображение, то есть я не вижу предварительно загруженное изображение, но все же позволяет рисовать прямоугольники.
Кроме того, вместо того, чтобы помещать jframe в середину моего экрана, он помещает его в верхний правый угол, и мне нужно развернуть его, чтобы увидеть кадр.
Код:
public class defineArea {
public static void main(String[] args) throws IOException {
displayImage();
}
private static void displayImage() throws IOException {
BufferedImage image = ImageIO.read(new File("C:\\Users\\Rusty\\Desktop\\temp\\Test_PDF-1.png"));
ImageIcon icon = new ImageIcon(image);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel lbl = new JLabel();
lbl.setIcon(icon);
JScrollPane jsp = new JScrollPane(lbl);
frame.add(jsp);
frame.add(new paintRectangles());
frame.pack();
frame.setVisible(true);
}
public static class paintRectangles extends JComponent {
ArrayList<Shape> shapes = new ArrayList<Shape>();
Point startDrag, endDrag;
public paintRectangles() throws IOException {
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
startDrag = new Point(e.getX(), e.getY());
endDrag = startDrag;
repaint();
}
public void mouseReleased(MouseEvent e) {
Shape r = makeRectangle(startDrag.x, startDrag.y, e.getX(), e.getY());
shapes.add(r);
startDrag = null;
endDrag = null;
repaint();
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
endDrag = new Point(e.getX(), e.getY());
repaint();
}
});
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Color[] colors = { Color.YELLOW, Color.MAGENTA, Color.CYAN, Color.RED, Color.BLUE, Color.PINK };
int colorIndex = 0;
g2.setStroke(new BasicStroke(2));
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f));
for (Shape s : shapes) {
g2.setPaint(Color.BLACK);
g2.draw(s);
g2.setPaint(colors[(colorIndex++) % 6]);
g2.fill(s);
}
if (startDrag != null && endDrag != null) {
g2.setPaint(Color.LIGHT_GRAY);
Shape r = makeRectangle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
g2.draw(r);
System.out.println(r.getBounds2D());
}
}
}
private static Rectangle2D.Float makeRectangle(int x1, int y1, int x2, int y2) {
return new Rectangle2D.Float(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
}
}
Кто-нибудь может помочь? Я в основном пытаюсь получить координаты 2d Rectangle из нарисованного прямоугольника (согласно системе getbounds2d).
если вы удалите frame.add(new paintRectangles());, вы сможете увидеть, как должна выглядеть рамка (но без возможности рисовать прямоугольники)
BorderLayout
и что он будет делать, если вы попытаетесь добавить два компонента в одну и ту же позицию. Во-вторых, переопределениеpaint
не является рекомендуемым подходом к выполнению пользовательского рисования, вы должны использоватьpaintComponent
и, если у вас нет четкого понимания того, как работает рисование, вызовитеsuper.paintComponent
, прежде чем выполнять какое-либо пользовательское рисование. В-третьих, вы, похоже, пытаетесь наложить компонент поверх панели прокрутки, что в текущей конфигурации не позволит панели прокрутки реагировать на события мыши. - person MadProgrammer   schedule 23.10.2017