Java-图形-在JPanel上添加另一个形状
我有一个类,它制作了一个JFrame并在上面添加了一个面板Java-图形-在JPanel上添加另一个形状,java,swing,graphics,drawing,Java,Swing,Graphics,Drawing,我有一个类,它制作了一个JFrame并在上面添加了一个面板 第二个扩展了JPanel并在其上绘制 第一个(JFrame) 第二个(JPanel) 如何使用addShape()方法在JPanel上添加字符串?不要使用组件的getGraphics()方法进行自定义绘制。这种类型的绘制只是临时性的,在下一次Swing确定需要绘制组件时将丢失 自定义绘制应始终在组件的paintComponent()方法中完成 请参阅,这两个共同点就是做您想做的事情。不要使用组件的getGraphics()方法进行自定
第二个扩展了JPanel并在其上绘制 第一个(JFrame) 第二个(JPanel)
如何使用addShape()方法在JPanel上添加字符串?不要使用组件的getGraphics()方法进行自定义绘制。这种类型的绘制只是临时性的,在下一次Swing确定需要绘制组件时将丢失 自定义绘制应始终在组件的paintComponent()方法中完成 请参阅,这两个共同点就是做您想做的事情。不要使用组件的getGraphics()方法进行自定义绘制。这种类型的绘制只是临时性的,在下一次Swing确定需要绘制组件时将丢失 自定义绘制应始终在组件的paintComponent()方法中完成
请参阅,这两个公用项就是做你想做的事。作为@camickr观点的一个具体示例,请注意
MyPanel
已经覆盖了的paintComponent()
,因此可以将对图形
上下文的引用传递到addShape()
。另外,
- 确保调用
super.paintComponent(g)
- 重写
,以建立组件的首选大小getPreferredSize()
- Swing GUI对象应仅在上构造和操作
作为@camickr观点的一个具体示例,请注意
MyPanel
已经覆盖了的paintComponent()
,因此您可以将对图形
上下文的引用传递到addShape()
。另外,
- 确保调用
super.paintComponent(g)
- 重写
,以建立组件的首选大小getPreferredSize()
- Swing GUI对象应仅在上构造和操作
为什么
addShape
方法需要从paintComponent
方法中“获取”g?这是设置用来更改主机对等组件中像素的方法。另一种方法是写入buffereImage
的像素,然后更新屏幕。这对我没有多大帮助,但至少现在我知道要写什么才能让它工作。。。所以,谢天谢地,这不是很令人满意。在最基本的层面上,您的Java程序必须共享主机的像素,而您的程序并不总是可以访问这些像素。当我希望addShape(Graphics g)方法独立运行,而不是每次在JFrame上添加MyPanel时,我该怎么办。这就是我最想知道的,addShape
方法为什么需要从paintComponent
方法中“获取”g?这是设置用来更改主机对等组件中像素的方法。另一种方法是写入buffereImage
的像素,然后更新屏幕。这对我没有多大帮助,但至少现在我知道要写什么才能让它工作。。。所以,谢天谢地,这不是很令人满意。在最基本的层面上,您的Java程序必须共享主机的像素,而您的程序并不总是可以访问这些像素。当我希望addShape(Graphics g)方法独立运行,而不是每次在JFrame上添加MyPanel时,我该怎么办。这是我最想知道的
class MyWindow {
void qwe() {
JFrame frame = new JFrame("qwe");
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyPanel panel = new MyPanel();
panel.setLayout(null);
frame.add(panel);}}
class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
g.drawRect(50,50,90,70);
}
public void addShape() {
Graphics g = this.getGraphics();
Graphics2D gg = (Graphics2D) g;
gg.drawString("qwe",20,20);}}
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyWindow {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new MyWindow().qwe();
}
});
}
void qwe() {
JFrame frame = new JFrame("qwe");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyPanel panel = new MyPanel();
panel.setLayout(null);
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static class MyPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(50, 50, 90, 70);
addShape(g);
}
public void addShape(Graphics g) {
g.drawString("qwe", 20, 20);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 200);
}
}
}