Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPanel上描绘新事物_Java_Swing_Jpanel_Paintcomponent - Fatal编程技术网

Java 在JPanel上描绘新事物

Java 在JPanel上描绘新事物,java,swing,jpanel,paintcomponent,Java,Swing,Jpanel,Paintcomponent,好的,我有一个覆盖了paintComponent方法的JPanel 很简单,看起来像这样: public class Panel1 extends JPanel { public void paintComponent (Graphics g) { super.paintComponent (g); g.fillOval (0, 0, getWidth (), getHeight ()); } } 现在,我将此JPanel作为属性添加到另一个JPanel类

好的,我有一个覆盖了paintComponent方法的JPanel

很简单,看起来像这样:

public class Panel1 extends JPanel {

   public void paintComponent (Graphics g) {
      super.paintComponent (g);
      g.fillOval (0, 0, getWidth (), getHeight ());
   }
}
现在,我将此JPanel作为属性添加到另一个JPanel类中,如:

public class Panel2 extends JPanel {

   Panel1 panel;

   public Panel2 (Panel1 panel) {
      this.panel = panel;
   }

   protected void paintComponent (Graphics g) {
      super.paintComponent (g);
      panel.paint (g); //This isn't working.
//          panel.paintComponent (g); //Tried this too

      g.drawOval (100, 100, getWidth () - 200, getHeight () - 200);
   }
}
我想要的是,Panel2与Panel1完全相同(无需硬编码),并可能添加其他内容(如三角形或其他,我不知道)

这可能吗?我调查了一下,但没有找到任何办法。提前感谢您的帮助

MAIN,以防有帮助:

public class Main {

   public static void main (String[] args) {
      JFrame frame = new JFrame ();
      frame.setSize (500, 500);

      frame.add (new Panel2 (new Panel1 ()));

      frame.setVisible (true);
   }
}
编辑:以防万一,我不想用继承来做;这就是为什么我把它作为一个属性添加,但如果有其他方法,现在就让我来

public class Panel2 extends JPanel {
    private Panel1 panel1;

    public Panel2 (Panel1 panel) {
        this.panel1 = panel;
    }

    protected void paintComponent (Graphics g) {
         panel1.paint(g);
    }  
}

我相信这应该会起作用

您可以尝试将
Panel1的
paintComponent
公开,然后调用
Panel2的
paintComponent

protected void paintComponent (Graphics g) {
    panel1.paintComponent(g);
}
您还可以在
Panel1
类中创建一个方法来为您处理绘画

public void yourPainting(Graphics g){
    //whatever you want to paint
}

然后在
Panel1
Panel2
paintComponent
方法中调用此方法。此方法无法按问题中所示的方式工作的原因是
Panel1
的大小为0x0。要获得合理的大小,请从
getPreferredSize()
返回一个大小,然后将面板大小设置为首选大小

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

public class PaintUnrealized {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                JFrame f = new JFrame("Paint Unrealized Component");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(new Panel2(new Panel1()));
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

class Panel1 extends JPanel {

    public Panel1() {
        setBackground(Color.RED);
        setSize(getPreferredSize());
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.fillOval(0, 0, getWidth(), getHeight());
    }

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

class Panel2 extends JPanel {

    Panel1 panel;

    public Panel2(Panel1 panel) {
        this.panel = panel;
        setBackground(Color.YELLOW);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        panel.paintComponent(g); // This works

        int pad = 25;
        g.drawOval(pad, pad, getWidth()-(2*pad), getHeight()-(2*pad));
    }

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


您可以将Panel1添加为Panel2的子级。是的,但正如我所说的,在这个示例中我需要避免继承。(这是一个学术性的例子,继承不会做我们需要它做的事情)。要更快地获得更好的帮助,请发布一个(最小完整可验证的例子)或(简短、自包含、正确的例子)。顺便说一句,在屏幕上显示尚未“实现”的组件有一些特殊的技巧,这可能是这里的问题;那会是什么样的“把戏”?我不是专家,只是开始研究这个。我试过了,但没用(什么都没用)。只是修改了帖子上的代码来添加所有内容,你能看看我们是否有相同的内容吗?试过了,但没用,它什么都没用=((修改了代码,以防你看到奇怪的地方)你是舒尔吗?你尝试了我建议的一切吗?我只是自己尝试了一下,效果很好。我尝试了。在我发布的新代码中,看到我如何将paintComponent声明为公共,并尝试在面板上使用paintComponent 2.paintComponent。你能看到代码吗?因为我开始认为它可能是其他东西(一个奇怪的初始化之类的,我不知道)。我只是添加了另一个建议,你可以尝试一下。顺便说一句,你想像这样将面板添加到框架中:frame.getContentPane().add(panel);也尝试过了。我知道它应该可以工作,但我不知道为什么不行