绘制jpanel图片 - 秋千



我有一个问题可以在JPanel上提取点。我想指出她的位置。因为在面板上,我加载了一张图片。对于每个单击按钮,我都会在面板上添加点。

,但我不出现在面板上。

文件SimpleIHM:

import java.awt.*; 
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class simpleIHM extends JFrame{

  JPanel JpLeft = new JPanel();
  JPanel JpRight = new JPanel();
  JButton btn1 = new JButton("Show");
  JLabel msgX = new JLabel("X :");
  JLabel msgY = new JLabel("Y :");
  JTextField textX = new JTextField(5);
  JTextField textY = new JTextField(5);
  public static int x,y = 0;
  JLabel img = null;
  BufferedImage image;
  public simpleIHM(){
        img = new JLabel(new ImageIcon("Centre.png"));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        JpLeft.add(img);
        PanelIMG imgPanel = new PanelIMG();
        JpLeft.add(imgPanel);
        getContentPane().add(JpLeft, BorderLayout.WEST);
        JpRight.add(msgX);
        JpRight.add(textX);
        JpRight.add(msgY);
        JpRight.add(textY);
        JpRight.add(btn1);
        JpRight.setLayout(new GridLayout(3, 2));
        getContentPane().add(JpRight, BorderLayout.EAST);
        pack();
        setVisible(true);
        showIMG("./Centre.png");
        //!!
        btn1.addMouseListener(new MouseAdapter() 
                                {
                                    public void mouseClicked(MouseEvent e) 
                                    {
                                        System.out.println("CLICK!");
                                        x = Integer.parseInt(textX.getText());
                                        y = Integer.parseInt(textY.getText());
                                        System.out.println("X "+x+ "| Y "+y); img.repaint();
                                    }
                                });
  }
    public void showIMG(String test){
        try
        {
            File input = new File("Centre.png");
            image = ImageIO.read(input);
        }
        catch (IOException ie)
        {
        System.out.println("Error:" + ie.getMessage());
        }
    }
  public static void main(String [ ] arg) {
        simpleIHM IHM = new simpleIHM();
       } 
}

文件面板

import javax.swing.JPanel;
import java.awt.*;
import javax.swing.*;

public class PanelIMG extends JPanel{
public PanelIMG()
{
}
@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.drawOval(simpleIHM.x, simpleIHM.y, 5, 5);
    System.out.println("Paint Component");
}
}

预先感谢

我可能已经误解了这个问题,但是似乎您想在图像上画一个点。但是在已发布的代码中,您实际上是在一个面板中绘制图像,而在另一个面板中绘制了点。

您可以创建带有背景图像的面板并在该面板中绘制一个点。以下是演示的示例。

另外,请注意一些小评论:

  • 除非添加新功能,否则无需扩展顶级容器JFrame
  • 如果无效,请使用DocumentFilterJFormattedTextField或处理异常来自用户的输入(即从 Integer.parseInt());
  • 其他类别使用的公共静态X,Y成员的技巧是肮脏的骇客,避免使用。
  • 熟悉Java代码约定,特别是命名约定部分。

这是一个演示:

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.net.URL;
import java.text.NumberFormat;
class ImagePanelDemo {
    static class ImagePanel extends JPanel {
        private Image image;
        private Point point;
        ImagePanel(Image image, Point point) {
            this.image = image;
            this.point = point;
        }
        public void setPoint(Point point) {
            this.point = point;
            repaint();
        }
        @Override
        public Dimension getPreferredSize() {
            if (image != null)
                return new Dimension(image.getWidth(this), 
                        image.getHeight(this));
            return super.getPreferredSize();
        }
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (image != null)
                g.drawImage(image,0,0,getWidth(),getHeight(),this);
            if (point != null)
                g.fillOval(point.x, point.y, 5, 5);
        }
    }
    private static void createAndShowUI() {
        try {
            JFrame frame = new JFrame("Image");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            Image image = ImageIO.read(new URL(
                "https://duke.kenai.com/comfyChair/ComfyChairRadSmall.jpg"));           
            final ImagePanel imagePanel = new ImagePanel(image, 
                    new Point(10, 10));
            frame.add(imagePanel);
            JPanel buttonPanel = new JPanel();
            final JFormattedTextField xField = new JFormattedTextField(
                    NumberFormat.getNumberInstance());
            xField.setColumns(5);
            final JFormattedTextField yField = new JFormattedTextField(
                    NumberFormat.getNumberInstance());
            yField.setColumns(5);
            JButton updateButton = new JButton("Update");
            buttonPanel.add(new JLabel("x:"));
            buttonPanel.add(xField);
            buttonPanel.add(new JLabel("y:"));
            buttonPanel.add(yField);
            buttonPanel.add(updateButton);
            updateButton.addMouseListener(new MouseAdapter() 
            {
                public void mouseClicked(MouseEvent e) {
                    try {
                    imagePanel.setPoint(new Point(
                            Integer.parseInt(xField.getText()), 
                            Integer.parseInt(yField.getText())));
                    } catch(NumberFormatException ex) {
                        ex.printStackTrace();
                    }
                }
            });
            frame.add(buttonPanel, BorderLayout.SOUTH);
            frame.pack();
            frame.setVisible(true);
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}

最新更新