java jpanel paint_关于swing:Java-图形-传递给paint()的Graphics对象与JPanel实例中的Graphics对象不同...

我有一个JPanel可以绘制形状并允许选择这些形状。我开始添加使用AffineTransform对象以及Graphics2D对象来转换此视图的功能。

在我的paint()方法中,当然会传入一个Graphics对象。我在该对象上设置了一个新的转换(在这种情况下,只是将内容缩放2倍),paint()方法中的所有内容均根据AffineTransform正确绘制我刚开始在这一点上,图形形状部分效果很好!现在开始选择形状...

形状选择从mousePressed()事件开始(我的JPanel实现了MouseListener接口)。当我有mousePressed()事件时,我调用this.getGraphics()来获取JPanel的Graphics对象。然后,将其装入Graphics2D对象,并对其调用getTransform()以获取当前的变换,以便可以将单击的点映射到该变换的点。但是,当我调用getTransform()时,AffineTransform返回到默认的AffineTransform [1,0,0],[0,1,0]。

我想也许传递给JPanel的paint()的Graphics对象与我的JPanel中的对象不同,但是我不有人知道这里发生了什么吗?

是的,您不能确定将获得相同的Graphics对象。 实际上,您不应在paintComponent()方法之外使用Graphics对象,因为这会破坏Swing UI模型。 如果这样做,您可能会得到工件和/或不完整的图纸。 正确的方法是使用一些实例变量来存储UI /小部件的状态。 调用mousePressed()时,只需更新这些变量并调用repaint()。 然后在您的paintComponent()方法中,应用适当的转换并绘制您的UI。

+1,除了paintComponent()应该被覆盖,而不是paint()

简单类打印对象或JPanel。

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.print.PageFormat;

import java.awt.print.Printable;

import java.awt.print.PrinterException;

import java.awt.print.PrinterJob;

import javax.print.attribute.HashPrintRequestAttributeSet;

import javax.print.attribute.PrintRequestAttributeSet;

import javax.print.attribute.standard.Chromaticity;

import javax.print.attribute.standard.DialogTypeSelection;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JTextField;

public class TemplateDemo extends JFrame implements Printable, ActionListener {

JButton btn;

JTextField name_txt;

JPanel panel;

public TemplateDemo() {

panel = new JPanel(null);

panel.setBounds(0, 0, 300, 300);

add(panel);

name_txt = new JTextField();

name_txt.setBounds(0, 10, 200, 20);

panel.add(name_txt);

btn = new JButton("Click");

btn.setBounds(0, 240, 200, 30);

btn.addActionListener(this);

panel.add(btn);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(0, 0, 400, 400);

setLayout(null);

setVisible(true);

}

@Override

public int print(Graphics g, PageFormat pageFormat, int pageIndex) {

Graphics2D graphics = (Graphics2D) g;

if (pageIndex == 0) {

g.translate((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY());

panel.print(g);

return PAGE_EXISTS;

}

return NO_SUCH_PAGE;

}

@Override

public void actionPerformed(ActionEvent e) {

PrinterJob pj = PrinterJob.getPrinterJob();

pj.setPrintable(this);

PrintRequestAttributeSet set = new HashPrintRequestAttributeSet();

set.add(Chromaticity.COLOR);

set.add(DialogTypeSelection.COMMON);

if (pj.printDialog(set)) {

try {

pj.print(set);

} catch (PrinterException ex) {

}

}

}

public static void main(String[] args) {

new TemplateDemo();

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值