能否从Panel(0,0)到(3000,1000)画条线 javaJPanel绘图 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 重载Jpanel的paintComponent(Graphics g)方法就好了import java.awt.Graphics;import javax.swing.JFrame;import javax.swing.JPanel;class DemoPanel extends JPanel { public DemoPanel() { } @Override protected void paintComponent(Graphics g) { g.drawLine(0, 0, 100, 200); } }public class Test extends JFrame{ Test(){ setSize(300, 300); add(new DemoPanel()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new Test().setVisible(true); }} 查了下资料,用java.awt.robot这个类的createScreenCapture可以截屏,然后用ImageIO.write成文件。但截屏的坐标和大小需要自己算,有点不好弄。 自己写了一个示例,备忘public class Demo extends JFrame { private JButton btn1 = new JButton("截屏"); Demo() { setTitle("截屏demo"); setSize(300, 300); add(btn1, BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); btn1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new Thread(new Runnable() { @Override public void run() { Robot robot; try { robot = new Robot(); Rectangle rect = Demo.this.getBounds(); BufferedImage img = robot.createScreenCapture(rect); ImageIO.write(img, "jpg", new File("a.jpg")); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }); } public static void main(String[] args) { new Demo().setVisible(true); }} 我试了一下,我发现createScreenCapture方法截的是电脑的显示屏,不是截当前panel中的图像。 这个问题我已经解决了,代码如下:public void drawPathShowImage(){ Image pathImage = Toolkit.getDefaultToolkit().getImage("./source/THU_2Dmap.jpg"); //首先创建一个BufferedImage变量, BufferedImage bi = new BufferedImage((int)map2Dimension.getWidth(), (int)map2Dimension.getHeight(), BufferedImage.TYPE_3BYTE_BGR); //再创建一个Graphics变量,用来画出来要保持的图片 Graphics2D g = (Graphics2D) bi.getGraphics(); try { g.drawImage(pathImage, 0, 0, null); g.setColor(Color.RED); g.setStroke(new BasicStroke(8.0f)); g.drawLine(0, 0, 5000, 4000); //将BufferedImage变量写入文件中。 ImageIO.write(bi,"jpg",new File("d:\\test.jpg")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 可是有个问题,我的面板里的图片可以切换。如果当前面板里显示的不是“./source/THU_2Dmap.jpg"这个图片,保存的就是一张有红线的黑底图片。如果当前显示的就是这个图片,保存的在这个图片上画了红线的图片。 写了一个可以随机切换的demo,备忘先随机加载一幅图,截图以后存传文件,然后再随机换图。import java.awt.BasicStroke;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Graphics2D;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.image.BufferedImage;import java.io.File;import java.util.Random;import javax.imageio.ImageIO;import javax.swing.BorderFactory;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;class DPanel extends JPanel{ private ImageIcon[] images = null; private JLabel lbl = null; private void initImages() { images = new ImageIcon[] { new ImageIcon("a.jpg"), new ImageIcon("b.jpg"), new ImageIcon("c.jpg") }; lbl = new JLabel(images[new Random().nextInt(images.length)]); } DPanel(){ initImages(); add(lbl); setBorder(BorderFactory.createLineBorder(Color.BLUE)); } JLabel getLbl(){ return this.lbl; } ImageIcon[] getImgs(){ return this.images; }}public class Demo extends JFrame { private JButton btn1 = new JButton("截屏"); private DPanel panel = new DPanel(); Demo() { setTitle("截屏demo"); setSize(300, 300); add(panel, BorderLayout.CENTER); add(btn1, BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); btn1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new Thread(new Runnable() { @Override public void run() { try { BufferedImage img = new BufferedImage( panel.getLbl().getIcon().getIconWidth(), panel.getLbl().getIcon().getIconHeight(), BufferedImage.TYPE_3BYTE_BGR); Graphics2D g2 = img.createGraphics(); g2.drawImage(((ImageIcon)panel.getLbl().getIcon()).getImage(), 0, 0, null); g2.setColor(Color.BLUE); g2.setStroke(new BasicStroke(8.0f)); g2.drawLine(0, 0, 500, 500); ImageIO.write(img, "jpg", new File("screenshot.jpg")); // 截屏以后随机选一幅图新加载到JLabel中 ImageIcon[] images = panel.getImgs(); JLabel lbl = panel.getLbl(); int n = new Random().nextInt(images.length); lbl.setIcon(images[n]); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }); } public static void main(String[] args) { new Demo().setVisible(true); }} JNI里的自定义函数如何调用JAVA函数 java正则表达式求救!!! 一个关于JDK源码中ArrayList类的add方法的问题 为什么Servlet要url-pattern映射,而jsp不要 swt如何实现awt中的color.darker()和color.brighter() 知道一个日期如何获得这个日期是该年的第几天? 何为flush() 关于空指针异常··求解决·在线等! 对SQL Server2000比较熟的朋友请进 在什么盘中可以找到 JAVA 编译器JDK1.3 OR 1.4 求大神 怎么将输入的一个数字按倒序分别输出来
import javax.swing.JPanel;class DemoPanel extends JPanel {
public DemoPanel() {
}
@Override
protected void paintComponent(Graphics g) {
g.drawLine(0, 0, 100, 200);
}
}
public class Test extends JFrame{
Test(){
setSize(300, 300);
add(new DemoPanel());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Test().setVisible(true);
}
}
但截屏的坐标和大小需要自己算,有点不好弄。
private JButton btn1 = new JButton("截屏"); Demo() {
setTitle("截屏demo");
setSize(300, 300);
add(btn1, BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); btn1.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable() { @Override
public void run() {
Robot robot;
try {
robot = new Robot();
Rectangle rect = Demo.this.getBounds();
BufferedImage img = robot.createScreenCapture(rect);
ImageIO.write(img, "jpg", new File("a.jpg"));
} catch (Exception e) {
e.printStackTrace();
} }
}).start();
}
});
} public static void main(String[] args) {
new Demo().setVisible(true);
}
}
public void drawPathShowImage(){
Image pathImage = Toolkit.getDefaultToolkit().getImage("./source/THU_2Dmap.jpg");
//首先创建一个BufferedImage变量,
BufferedImage bi = new BufferedImage((int)map2Dimension.getWidth(), (int)map2Dimension.getHeight(),
BufferedImage.TYPE_3BYTE_BGR); //再创建一个Graphics变量,用来画出来要保持的图片
Graphics2D g = (Graphics2D) bi.getGraphics();
try {
g.drawImage(pathImage, 0, 0, null);
g.setColor(Color.RED);
g.setStroke(new BasicStroke(8.0f));
g.drawLine(0, 0, 5000, 4000);
//将BufferedImage变量写入文件中。
ImageIO.write(bi,"jpg",new File("d:\\test.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
如果当前面板里显示的不是“./source/THU_2Dmap.jpg"这个图片,保存的就是一张有红线的黑底图片。如果当前显示的就是这个图片,保存的在这个图片上画了红线的图片。
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;class DPanel extends JPanel{
private ImageIcon[] images = null;
private JLabel lbl = null;
private void initImages() {
images = new ImageIcon[] { new ImageIcon("a.jpg"),
new ImageIcon("b.jpg"), new ImageIcon("c.jpg") };
lbl = new JLabel(images[new Random().nextInt(images.length)]);
}
DPanel(){
initImages();
add(lbl);
setBorder(BorderFactory.createLineBorder(Color.BLUE));
}
JLabel getLbl(){
return this.lbl;
}
ImageIcon[] getImgs(){
return this.images;
}
}public class Demo extends JFrame {
private JButton btn1 = new JButton("截屏");
private DPanel panel = new DPanel(); Demo() {
setTitle("截屏demo");
setSize(300, 300);
add(panel, BorderLayout.CENTER);
add(btn1, BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); btn1.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
new Thread(new Runnable() { @Override
public void run() {
try {
BufferedImage img = new BufferedImage(
panel.getLbl().getIcon().getIconWidth(),
panel.getLbl().getIcon().getIconHeight(),
BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g2 = img.createGraphics();
g2.drawImage(((ImageIcon)panel.getLbl().getIcon()).getImage(),
0, 0, null);
g2.setColor(Color.BLUE);
g2.setStroke(new BasicStroke(8.0f));
g2.drawLine(0, 0, 500, 500);
ImageIO.write(img, "jpg", new File("screenshot.jpg"));
// 截屏以后随机选一幅图新加载到JLabel中
ImageIcon[] images = panel.getImgs();
JLabel lbl = panel.getLbl();
int n = new Random().nextInt(images.length);
lbl.setIcon(images[n]);
} catch (Exception e) {
e.printStackTrace();
} }
}).start();
}
});
} public static void main(String[] args) {
new Demo().setVisible(true);
}
}