——求助:drawPolygon的问题,总是显示不出来想要的效果———— 本帖最后由 songhu987 于 2011-05-16 16:06:08 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的错误原因,见我添加上去的三行注释import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import javax.swing.JFrame;import javax.swing.JPanel;public class drawPolygon { public static void main(String[] args) { // 测试坐标数据,将x、y轴坐标分别存储 int xpoints[] = {25, 145, 25, 145, 275, 478, 345}; int ypoints[] = {25, 25, 145, 145, 165, 223, 267}; int npoints = 7; //你帖出来的程序是错误的,你PolygonFrame的构造函数的contentPane.add(panel); //你哪来的panel //我改了一个,把panel作为参数传递进去 myPolygonPanel panel = new myPolygonPanel(); PolygonFrame frame = new PolygonFrame(panel); panel.setPoints(xpoints, ypoints, npoints);// Container contentPane = getContentPane(); // contentPane.add(panel); frame.show(); }}class PolygonFrame extends JFrame { public PolygonFrame(JPanel panel) { setTitle(" Polygon "); setResizable(false); setSize(600, 400); Container contentPane = getContentPane(); contentPane.add(panel); }}class myPolygonPanel extends JPanel { int[] xpoints; int[] ypoints; int npoints; // 设置坐标参数 public void setPoints(int[] x, int[] y, int n) { this.xpoints = x; this.ypoints = y; this.npoints = n; } // 画多边形 public void paint(Graphics g) { g.setColor(Color.red); g.drawPolygon(xpoints, ypoints, npoints); // 首尾相接 // g.drawPolyline(xpoints, ypoints, npoints); //首尾未相接 }} 当时确实是没看出来,也没有想到是这个原因,谢谢wenbodong。第二个小问题是,怎样才能想把先后画出的两个文件的图形同时显示出来? 以及图形的缩放?能给个简单小例子最好 什么是先后画出的两个“文件”图形同时显示?不太清楚你的意思。至于缩放变换,就是对BufferedImage进行变换嘛。不知道你是否熟悉BufferedImage,用getRGB可以获取它的一个数组,这就是它图像的内容,对此进行操作。不过,Java已经为你提供了强大的图形变换类,不用自己设计了。下面是一个演示,程序运行时点击菜单打开一个图片文件,调节滑块可进行缩放。作为一个示例程序,稍微长了一点,你主要是看change2这个函数,再看看pan中的paint就可以了。/* * To change this template, choose Tools | Templates * and open the template in the editor. *//** * * @author Administrator */import java.io.IOException;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.*;import java.awt.*;import java.awt.geom.*;import java.awt.image.*;import java.awt.event.*;import java.awt.image.BufferedImage;import java.io.File;import java.util.*;import javax.imageio.ImageIO;import javax.swing.event.ChangeEvent;import javax.swing.event.ChangeListener;public class ZoomInAndZoomOut { JFrame frame; JPanel pan; JPanel contentPane; JMenuBar menuBar; JMenu fileMenu; JMenuItem openMenuItem; JScrollPane jsp; BufferedImage buffer,paintBuffer; JSlider opaqueSlider; double opaqueValue; public ZoomInAndZoomOut(){ //takePhoto(); frame=new JFrame(); pan=new JPanel(){ public void paint(Graphics g){ int width=pan.getWidth(); int height=pan.getHeight(); g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); if(paintBuffer!=null){ g.drawImage(paintBuffer, 0, 0, null); } } }; pan.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent e){ int x=e.getX(); int y=e.getY(); System.out.println("["+x+","+y+"]"); } }); pan.setPreferredSize(new Dimension(800,600)); contentPane=new JPanel(); contentPane.setLayout(new BorderLayout()); setMenu(); jsp=new JScrollPane(pan); jsp.setPreferredSize(new Dimension(800,600)); contentPane.add(jsp,BorderLayout.CENTER); setSlider(); frame.setContentPane(contentPane); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } public void setMenu(){ menuBar=new JMenuBar(); contentPane.add(menuBar,BorderLayout.NORTH); fileMenu=new JMenu("文件"); menuBar.add(fileMenu); openMenuItem=new JMenuItem("打开"); openMenuItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { JFileChooser jfc=new JFileChooser(); jfc.setCurrentDirectory(new File(".")); jfc.setApproveButtonText("确定"); int result=jfc.showOpenDialog(frame); if(result==JFileChooser.APPROVE_OPTION){ File f=jfc.getSelectedFile(); try { buffer = ImageIO.read(f); paintBuffer = ImageIO.read(f); frame.repaint(); } catch (IOException ex) { Logger.getLogger(ZoomInAndZoomOut.class.getName()).log(Level.SEVERE, null, ex); } } } }); fileMenu.add(openMenuItem); } public void setSlider(){ opaqueSlider=new JSlider(); opaqueSlider.setMinimum(0); opaqueSlider.setMaximum(200); opaqueSlider.setMajorTickSpacing(10); opaqueSlider.setMinorTickSpacing(2); opaqueSlider.setPaintLabels(true); opaqueSlider.setPaintTrack(true); opaqueSlider.setPaintTicks(true); opaqueSlider.setValue(100); opaqueValue=1; opaqueSlider.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e){ opaqueValue=opaqueSlider.getValue()/100.0; change2(opaqueValue); int width=(int)(buffer.getWidth()*opaqueValue); int height=(int)(buffer.getHeight()*opaqueValue); pan.setPreferredSize(new Dimension(width,height)); jsp.updateUI(); frame.repaint(); System.out.println(opaqueValue); } }); contentPane.add(opaqueSlider,BorderLayout.SOUTH); } public void change2(double rate){ //生成一个缩放变换,两个参数分别是X轴、Y轴的缩放因子 AffineTransform transform = AffineTransform.getScaleInstance(rate,rate); //构造线性映射 AffineTransformOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR); //进行变换 paintBuffer=op.filter(buffer, null); } public static void main(String args[]){ new ZoomInAndZoomOut(); }}对于同时显示两个图片的问题,可以加我QQ:815611030,备注说明:Java applet在浏览器中运行出错问题 选择数据库问题 Java获得系统时间 关于JDK中的javah -stubs命令 jdk下的问题 ☆☆★★☆☆★★ 会用Swing的高手请进,高分!!! ◇◇◆◆◇◇◆◆◇◇◆◆ 谁能告诉我这些都是什么? jaxp的迷惑!! NoClassDefFoundError! 我做的swing软件里有很多JLabel显示几秒就不显示了怎么才能把内存清掉? java 做一个LOL自动喊话工具 用Robot还是什么 新手求助:输入输出流的一些问题 jframe 布局
import java.awt.Container;
import java.awt.Graphics;import javax.swing.JFrame;
import javax.swing.JPanel;public class drawPolygon { public static void main(String[] args) { // 测试坐标数据,将x、y轴坐标分别存储
int xpoints[] = {25, 145, 25, 145, 275, 478, 345};
int ypoints[] = {25, 25, 145, 145, 165, 223, 267};
int npoints = 7;
//你帖出来的程序是错误的,你PolygonFrame的构造函数的contentPane.add(panel);
//你哪来的panel
//我改了一个,把panel作为参数传递进去
myPolygonPanel panel = new myPolygonPanel();
PolygonFrame frame = new PolygonFrame(panel);
panel.setPoints(xpoints, ypoints, npoints);
// Container contentPane = getContentPane();
// contentPane.add(panel);
frame.show();
}
}class PolygonFrame extends JFrame { public PolygonFrame(JPanel panel) {
setTitle(" Polygon ");
setResizable(false);
setSize(600, 400);
Container contentPane = getContentPane();
contentPane.add(panel);
}
}class myPolygonPanel extends JPanel { int[] xpoints;
int[] ypoints;
int npoints; // 设置坐标参数
public void setPoints(int[] x, int[] y, int n) {
this.xpoints = x;
this.ypoints = y;
this.npoints = n;
} // 画多边形
public void paint(Graphics g) {
g.setColor(Color.red);
g.drawPolygon(xpoints, ypoints, npoints); // 首尾相接
// g.drawPolyline(xpoints, ypoints, npoints); //首尾未相接
}
}
至于缩放变换,就是对BufferedImage进行变换嘛。不知道你是否熟悉BufferedImage,用getRGB可以获取它的一个数组,这就是它图像的内容,对此进行操作。不过,Java已经为你提供了强大的图形变换类,不用自己设计了。
下面是一个演示,程序运行时点击菜单打开一个图片文件,调节滑块可进行缩放。作为一个示例程序,稍微长了一点,你主要是看change2这个函数,再看看pan中的paint就可以了。/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*//**
*
* @author Administrator
*/
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.*;
import javax.imageio.ImageIO;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class ZoomInAndZoomOut {
JFrame frame;
JPanel pan;
JPanel contentPane;
JMenuBar menuBar;
JMenu fileMenu;
JMenuItem openMenuItem;
JScrollPane jsp;
BufferedImage buffer,paintBuffer;
JSlider opaqueSlider;
double opaqueValue;
public ZoomInAndZoomOut(){
//takePhoto();
frame=new JFrame();
pan=new JPanel(){
public void paint(Graphics g){
int width=pan.getWidth();
int height=pan.getHeight();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
if(paintBuffer!=null){
g.drawImage(paintBuffer, 0, 0, null);
}
}
};
pan.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
int x=e.getX();
int y=e.getY();
System.out.println("["+x+","+y+"]");
}
});
pan.setPreferredSize(new Dimension(800,600));
contentPane=new JPanel();
contentPane.setLayout(new BorderLayout());
setMenu();
jsp=new JScrollPane(pan);
jsp.setPreferredSize(new Dimension(800,600));
contentPane.add(jsp,BorderLayout.CENTER);
setSlider();
frame.setContentPane(contentPane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public void setMenu(){
menuBar=new JMenuBar();
contentPane.add(menuBar,BorderLayout.NORTH);
fileMenu=new JMenu("文件");
menuBar.add(fileMenu);
openMenuItem=new JMenuItem("打开");
openMenuItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
JFileChooser jfc=new JFileChooser();
jfc.setCurrentDirectory(new File("."));
jfc.setApproveButtonText("确定");
int result=jfc.showOpenDialog(frame);
if(result==JFileChooser.APPROVE_OPTION){
File f=jfc.getSelectedFile();
try {
buffer = ImageIO.read(f);
paintBuffer = ImageIO.read(f);
frame.repaint();
} catch (IOException ex) {
Logger.getLogger(ZoomInAndZoomOut.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
fileMenu.add(openMenuItem);
}
public void setSlider(){
opaqueSlider=new JSlider();
opaqueSlider.setMinimum(0);
opaqueSlider.setMaximum(200);
opaqueSlider.setMajorTickSpacing(10);
opaqueSlider.setMinorTickSpacing(2);
opaqueSlider.setPaintLabels(true);
opaqueSlider.setPaintTrack(true);
opaqueSlider.setPaintTicks(true);
opaqueSlider.setValue(100);
opaqueValue=1;
opaqueSlider.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e){
opaqueValue=opaqueSlider.getValue()/100.0;
change2(opaqueValue);
int width=(int)(buffer.getWidth()*opaqueValue);
int height=(int)(buffer.getHeight()*opaqueValue);
pan.setPreferredSize(new Dimension(width,height));
jsp.updateUI();
frame.repaint();
System.out.println(opaqueValue);
}
});
contentPane.add(opaqueSlider,BorderLayout.SOUTH);
}
public void change2(double rate){
//生成一个缩放变换,两个参数分别是X轴、Y轴的缩放因子
AffineTransform transform = AffineTransform.getScaleInstance(rate,rate);
//构造线性映射
AffineTransformOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
//进行变换
paintBuffer=op.filter(buffer, null);
}
public static void main(String args[]){
new ZoomInAndZoomOut();
}
}对于同时显示两个图片的问题,可以加我QQ:815611030,备注说明:Java