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

时间:2014-01-26 10:28:15

标签: java swing graphics jpanel paint

这是我的问题:

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

在另一个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();


 }
}

2 个答案:

答案 0 :(得分:2)

所以这就是你需要做的。

  1. 您需要将第一个JPanel的{​​{1}}上下文保存到Graphics。这是一个帮助方法,我在下面的示例程序中使用

    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

  2. 使用BufferedImage在第二个BufferedImage上绘画。使用您想要的任何坐标。从JPanel class

    使用此方法
    Graphics

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

    public abstract boolean drawImage(Image img,
            int dx1,
            int dy1,
            int dx2,
            int dy2,
            int sx1,
            int sy1,
            int sx2,
            int sy2,
            ImageObserver observer)
    
  3. 这是结果

    enter image description here

    这是完整的代码

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

答案 1 :(得分:0)

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();

你创建了空白的BufferedImage和init到Graphics2D?

panel.paint(g);

您在面板上绘制图形上下文并复制到bi?

        g.dispose();

你释放g。

    }