簡體   English   中英

我正在嘗試使用圖像的坐標在imageIcon上繪制一個填充矩形,並且矩形顯示為關閉

[英]I'm trying to draw a filled rectangle over an imageIcon using the coordinates of the image and the rectangle appears off

最后,在我計算出這個小細節之后,它將收到一個建築物和房間號碼,以概述所說的建築物和房間號碼,因此很容易找到,但我不能讓矩形在一個房間內畫得非常接近。

package programSTLApp;
/*
   Program to request the classroom no. in STLCC and Display the location of 
   that classroom.
 */

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

public class STLApp extends JFrame
{
    private JLabel imageLabel;
    private JButton button;
    private JPanel imagePanel;
    private JPanel buttonPanel;

public STLApp()
{
    super("My STLCC Class Locator");   

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    buildImagePanel();
    buildButtonPanel();

    add(imagePanel, BorderLayout.CENTER);
    add(buttonPanel,BorderLayout.SOUTH);

    pack();
    setVisible(true);
}

private void buildImagePanel()
{
    imagePanel = new JPanel();
    imageLabel = new JLabel("Click the button to see the drawing indicating "
            + "the location of your class");
    imagePanel.add(imageLabel);
}

private void buildButtonPanel()
{
    buttonPanel = new JPanel();

    button = new JButton("Get Image");

    button.addActionListener(new ButtonListener());
    buttonPanel.add(button);
}

private class ButtonListener implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        ImageIcon SiteLayoutFV = new ImageIcon("D:\\B120.jpg");
        imageLabel.setIcon(SiteLayoutFV);
        imageLabel.setText(null);
        pack();
    }

}
public void paint(Graphics g)
    {
        super.paint(g);
        g.setColor(Color.RED);
        g.fillRect(55,740,164,815);
    }


    public static void main(String[] args) 
    {
        new STLApp();


    }
}

正如已經指出的那樣,頂級容器不是用於進行定制塗裝的可分類的容器,這些容器也很容易使其易於塗漆。

相反,創建一個自定義組件,從JPanel擴展,並覆蓋它的paintComponent方法。

渲染了地板窗格后,可以在其頂部渲染自定義元素。

如何存儲這些信息取決於您,但基本上,您需要某種映射,以便您可以占用樓層/房間並獲得應呈現的Shape

因為樓層地圖可能會浮動(例如,它可能並不總是以0x0渲染),所以您需要能夠translate坐標以使Shape始終匹配。

看一眼...

更多細節

在此輸入圖像描述

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FloorPlan {

    public static void main(String[] args) {
        new FloorPlan();
    }

    public FloorPlan() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage floorPlan;

        private Rectangle myOffice = new Rectangle(150, 50, 32, 27);

        public TestPane() {
            try {
                floorPlan = ImageIO.read(new File("floorPlan.png"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return floorPlan == null ? new Dimension(200, 200) : new Dimension(floorPlan.getWidth(), floorPlan.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            if (floorPlan != null) {

                int x = (getWidth() - floorPlan.getWidth()) / 2;
                int y = (getHeight() - floorPlan.getHeight()) / 2;
                g2d.drawImage(floorPlan, x, y, this);

                g2d.setColor(Color.RED);
                g2d.translate(x, y);
                g2d.draw(myOffice);

            }

            g2d.dispose();
        }
    }

}

暫無
暫無

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

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