java - 如何将一个 JPanel 的特定坐标绘制到另一个 JPanel 上

标签 java swing graphics jpanel paint

这是我的问题:

我有一个 JPanel,我在这个面板上画了一个矩形。 100x100。

在另一个 JPanel 中,我想在第一个 JPanel ex 上显示/绘制片段。 50x50,但如果我更改第一个 JPanel,另一个 JPanel 也会更改(不要复制图形或面板) 我能做什么?

enter image description here enter image description here

            第一面板                         第二面板

<小时/>
Public class Okienko extends JFrame { 
Panel p = new Panel();
public Okienko(){

//setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(p);
pack();
setVisible(true);

}

private class Panel extends JPanel{

    public Panel(){
    setPreferredSize(new Dimension(300,400));
    setBackground(Color.red);
    setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
         Graphics2D g2 = (Graphics2D) g;
         super.paint(g2);
         g2.setColor(Color.blue);
         g2.fill(new Rectangle2D.Float(100,100,100,100));
         g2.setColor(Color.green);
         g2.fill(new Rectangle2D.Float(50,50,50,50));
    }

}
private class Panel2 extends Panel{


    @Override
    public void paint(Graphics g) {

      //I would like to show/paint only fragment painted Panel, ex. 50x50 (only show one rectangle)

    }



}

 public static void main(String[] args) {

   Okienko o =  new Okienko();


 }
}

最佳答案

所以这就是你需要做的。

  1. 您需要将第一个 JPanelGraphics 上下文保存到 BufferedImage。这是一个辅助方法,我在下面的示例程序中使用了

    BufferedImage bi;
    ....
    private void setImage(JPanel panel) {
        Dimension d = panel.getPreferredSize();
        int w = (int)d.getWidth();
        int h =(int)d.getHeight();
        bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bi.createGraphics();
        panel.paint(g);
        g.dispose();
    }
    

    这会将整个 JPanel 保存到 BufferedImage

  2. 使用该 BufferedImage 在第二个 JPanel 上进行绘制。使用您想要的任何坐标。使用 Graphics

    中的此方法
    public abstract boolean drawImage(Image img,
            int dx1,
            int dy1,
            int dx2,
            int dy2,
            int sx1,
            int sy1,
            int sx2,
            int sy2,
            ImageObserver observer)
    

    img - 要绘制的指定图像。如果 img 为 null,则此方法不执行任何操作。
    dx1 - 目标矩形第一个角的 x 坐标。
    dy1 - 目标矩形第一个角的 y 坐标。
    dx2 - 目标矩形第二个角的 x 坐标。
    dy2 - 目标矩形第二个角的 y 坐标。
    sx1 - 源矩形第一个角的 x 坐标。
    sy1 - 源矩形第一个角的 y 坐标。
    sx2 - 源矩形第二个角的 x 坐标。
    sy2 - 源矩形第二个角的 y 坐标。
    观察者 - 当更多图像被缩放和转换时要通知的对象。

    g.drawImage(bi, 0, 0, 200, 200, 0, 0, 50, 50, this);
    

这是结果

enter image description here

这是完整的代码

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;

public class TestTwoPanels {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {

                JPanel panel = new JPanel();
                PanelTwo panelTwo = new PanelTwo();
                PanelOne panelOne = new PanelOne(panelTwo);

                JSplitPane split = new JSplitPane(
                        JSplitPane.HORIZONTAL_SPLIT, panelOne, panelTwo);
                panel.add(split);


                JFrame frame = new JFrame("Test Graphics");
                frame.add(panel);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    private static class PanelOne extends JPanel {

        Dimension size;
        BufferedImage image;
        PanelTwo panelTwo;

        public PanelOne(PanelTwo panelTwo) {
            this.panelTwo = panelTwo;
            try {
                URL url = new URL("http://swoo.co.uk/content/images/icons/stackoverflow.png");
                image = ImageIO.read(url);
            } catch (MalformedURLException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
            panelTwo.setImage(PanelOne.this);
            panelTwo.repaint();

        }

        @Override
        public void paint(Graphics g) {
            super.paint(g);
            g.drawImage(image, 0, 0, this);

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(250, 250);
        }
    }

    private static class PanelTwo extends JPanel {

        BufferedImage bi;

        public PanelTwo() {
            setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        }

        public void setImage(BufferedImage image) {
            this.bi = image;
        }

        private void setImage(JPanel panel) {
            Dimension d = panel.getPreferredSize();
            int w = (int)d.getWidth();
            int h =(int)d.getHeight();
            System.out.println(d);
            bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bi.createGraphics();
            panel.paint(g);
            g.dispose();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(bi, 25, 25, 225, 225, 50, 50, 175, 175, this);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(250, 250);
        }
    }
}

关于java - 如何将一个 JPanel 的特定坐标绘制到另一个 JPanel 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21362278/

相关文章:

java - android 打开带参数的url

javax.mail.messagingException 连接超时 连接

java - 通过按下按钮更改 Jtextfield ("MobilePhone Interface")

Java KeyPressed KeyRelease 并按住某个键

java - 为什么单击时没有出现圆圈?

image-processing - 更改 jpeg 的曝光度

java - Maven Cargo 不会停止容器

java - 如何在JTable的单元格中实现自动完成功能?

java - 在 Java 全屏应用程序中放置 SWING 组件的最佳实践?

ios - 如何在iPhone/iPad中保存图形数据?