在Java中我们可以在子类本身和子类的方法之外创建一个子类的对象吗?

In Java can we create an object of a subclass in the subclass itself and outside the methods of the subclass?

我需要在子类本身但在子类的所有方法之外创建一个子类的对象。

在下面的代码中,我想在指定位置(代码中的注释部分)创建一个 ODrawPanel 对象,但是当我这样做时,我得到了 WhosebugError。但是,我可以在 display() 方法内创建对象 ODrawPanel 没有问题,但在那种情况下我不能在其他方法中使用它。我需要在面板上做一些绘图,并且面板必须在代码中的任何位置可用。

如何使面板对象在代码中的任何位置可用?

感谢您的帮助。

package odrawpanel;

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

public class ODrawPanel extends JPanel
{ 
    
        private Point p1 = new Point(100, 300);
        private Point p2 = new Point(380, 300);

        // Either
        // JPanel panel = new ODrawPanel();     I want to create the object of the subclass here.
        // or
        // ODrawPanel panel = new ODrawPanel();

        @Override
        protected void paintComponent(Graphics g) 
        {
            super.paintComponent(g);
            g.setColor(Color.BLUE);       
            g.drawLine(p1.x, p1.y, p2.x, p2.y);
                        
        }
         
        public void display() 
        {   
            JPanel panel = new ODrawPanel(); 
            JFrame f = new JFrame();
 
            panel.setBounds(40, 40, 400, 400);    
            panel.setBackground(Color.white); 
            
            f.add(panel);  
            f.setSize(800,600);    
            f.setLayout(null);    
            f.setLocationRelativeTo(null);
            f.setVisible(true); 
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            f.addComponentListener(new ComponentAdapter() 
            {           
                @Override
                public void componentResized(ComponentEvent e) 
                {
                  panel.setSize(f.getWidth()-100,f.getHeight()-100);                                 
                }
        
            });
         
        }
        
        public static void main(String args[])  
        {          
                EventQueue.invokeLater(new Runnable() 
                  {
                      @Override
                      public void run() 
                      {
                         new ODrawPanel().display();                        
                      }
                  });  
        }
        
}  



我会为 main()、JFrame、JPanel 创建不同的 类。

主要内容: 新的 JFrame();

在 JFrame 中: 添加(新的 JPanel()); ...

在 JPanel 中: 不要在此处创建 JPanel。 ...

您可以将延迟初始化的 JPanel 供应商声明为 class:

的字段
private Point p1 = new Point(100, 300);
private Point p2 = new Point(380, 300);
private final Supplier<JPanel> panelSupplier = new Supplier<>() {

    private JPanel panel;

    @Override
    public JPanel get() {
        if (panel == null) {
            panel = new ODrawPanel();
        }
        return panel;
    }
};

... 然后通过 .get() 调整供应商的值在整个 class 中使用它(第一次使用它时,将创建 ODrawPanel 但它不会导致溢出,因为您没有递归地初始化它:

public void display() {
    JPanel panel = panelSupplier.get(); //the first time you call get() it will create the panel, the next times it will reuse it
    JFrame f = new JFrame();

    panel.setBounds(40, 40, 400, 400);
    //...rest of the code

Matteo,谢谢你的代码。当我尝试它时,我收到以下行的编译器错误:

private final Supplier<JPanel> panelSupplier = new Supplier<>()
{
   // some code here.
};
"cannot infer type arguments for Supplier<T>
  reason: '<>' with anonymous inner classes is not supported in -source 8
    (use -source 9 or higher to enable '<>' with anonymous inner classes)
  where T is a type-variable:
    T extends Object declared in interface Supplier"

修改代码后:

private final Supplier<JPanel> panelSupplier = new Supplier<JPanel>()
{
  // some code here.
}

我没有收到错误。例如,它以如下方法工作:

public void Test()
{
  JPanel panel = panelSupplier.get();
  panel.setBackground(Color.RED);
}

但是在方法中没有作用:

protected void paintComponent(Graphics g) 
{
   super.paintComponent(g);
   g.setColor(Color.BLUE);       
   g.drawLine(p1.x, p1.y, p2.x, p2.y);
            
   JPanel panel = panelSupplier.get();
   panel.setBackground(Color.CYAN); 
}