在分层窗格上绘制到 JPanel
Drawing to JPanel on Layered Pane
我想要做的是自定义绘制到附加到分层窗格中的其中一个图层的 JPanel。
对于简单的绘图,我知道您可以有效地执行以下操作:-
JFrame frame = new JFrame();
frame.add(new CustomPaintComponent());
我有这个并且调用了 CustomPaintComponent,绘制到创建的测试框架 - 一切正常。但是......如果我尝试相同的方法(如下)但使用窗格而不是框架,甚至不会调用 CustomPaintComponent 更不用说生成与简单添加到框架时得到的相同的图形了。
pane.add(new CustomPaintComponent(),JLayeredPane.POPUP_LAYER);
如果有任何关于此的 support/advice,我将不胜感激。为什么不调用该方法 - 我是否应该做一些不同的事情(可能很多 :P)?
下面的简单示例
创建 JFrame 和 JLayeredPane 和 JPanel 的示例 Class(后者访问下面的第二个 class)
package example;
import javax.swing.*;
public class Example {
public static void main(String[] args) {
JLayeredPane forLayers = new JLayeredPane();
forLayers.setSize(300, 300);
JFrame showsDrawnImage = new JFrame ("JFrame");
showsDrawnImage.setSize(300, 300);
JPanel panelDrawnOn = new DrawImage();
//CODE BELOW WORKS - and returns string line in output//
showsDrawnImage.add(panelDrawnOn); //blank these out to show the layeredpane example
showsDrawnImage.setVisible(true); //blank these out to show the layeredpane example
//CODE BELOW DOESN'T WORK - only shows the JFrame and DOES NOT return string line in output//
forLayers.add(panelDrawnOn, JLayeredPane.PALETTE_LAYER);
showsDrawnImage.add(forLayers);
forLayers.setVisible(true);
showsDrawnImage.setVisible(true);
}
}
DrawImage class 进行实际绘图
package example;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JPanel;
public class DrawImage extends JPanel{
public void paintComponent( Graphics g ) {
System.out.println("This is what I try to access/draw");
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
Line2D line = new Line2D.Double(10, 10, 40, 40);
g2.setColor(Color.blue);
g2.setStroke(new BasicStroke(10));
g2.draw(line);
}
}
我猜主要问题是您的自定义组件没有“大小”,因此没有什么可绘制的。
当您将组件添加到 JFrame 时,布局管理器将为组件指定一个大小。 JLayeredPane 不使用布局管理器,因此现在您有责任为组件指定大小和位置。
阅读 Swing 教程中关于 How to Use Layered Panes 的部分以获得工作示例。
另外,不要使用 POPUP_LAYER。这意味着仅用于组件的临时显示。
我想要做的是自定义绘制到附加到分层窗格中的其中一个图层的 JPanel。
对于简单的绘图,我知道您可以有效地执行以下操作:-
JFrame frame = new JFrame();
frame.add(new CustomPaintComponent());
我有这个并且调用了 CustomPaintComponent,绘制到创建的测试框架 - 一切正常。但是......如果我尝试相同的方法(如下)但使用窗格而不是框架,甚至不会调用 CustomPaintComponent 更不用说生成与简单添加到框架时得到的相同的图形了。
pane.add(new CustomPaintComponent(),JLayeredPane.POPUP_LAYER);
如果有任何关于此的 support/advice,我将不胜感激。为什么不调用该方法 - 我是否应该做一些不同的事情(可能很多 :P)?
下面的简单示例
创建 JFrame 和 JLayeredPane 和 JPanel 的示例 Class(后者访问下面的第二个 class)
package example;
import javax.swing.*;
public class Example {
public static void main(String[] args) {
JLayeredPane forLayers = new JLayeredPane();
forLayers.setSize(300, 300);
JFrame showsDrawnImage = new JFrame ("JFrame");
showsDrawnImage.setSize(300, 300);
JPanel panelDrawnOn = new DrawImage();
//CODE BELOW WORKS - and returns string line in output//
showsDrawnImage.add(panelDrawnOn); //blank these out to show the layeredpane example
showsDrawnImage.setVisible(true); //blank these out to show the layeredpane example
//CODE BELOW DOESN'T WORK - only shows the JFrame and DOES NOT return string line in output//
forLayers.add(panelDrawnOn, JLayeredPane.PALETTE_LAYER);
showsDrawnImage.add(forLayers);
forLayers.setVisible(true);
showsDrawnImage.setVisible(true);
}
}
DrawImage class 进行实际绘图
package example;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JPanel;
public class DrawImage extends JPanel{
public void paintComponent( Graphics g ) {
System.out.println("This is what I try to access/draw");
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
Line2D line = new Line2D.Double(10, 10, 40, 40);
g2.setColor(Color.blue);
g2.setStroke(new BasicStroke(10));
g2.draw(line);
}
}
我猜主要问题是您的自定义组件没有“大小”,因此没有什么可绘制的。
当您将组件添加到 JFrame 时,布局管理器将为组件指定一个大小。 JLayeredPane 不使用布局管理器,因此现在您有责任为组件指定大小和位置。
阅读 Swing 教程中关于 How to Use Layered Panes 的部分以获得工作示例。
另外,不要使用 POPUP_LAYER。这意味着仅用于组件的临时显示。