在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);
}
我需要在子类本身但在子类的所有方法之外创建一个子类的对象。
在下面的代码中,我想在指定位置(代码中的注释部分)创建一个 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);
}