簡體   English   中英

繪制JPanel圖片-搖擺

[英]Draw JPanel picture - Swing

我在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();
       } 
}

文件面板IMG

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()引發的NumberFormatException);
  • 其他類使用的公共靜態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();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM