调整图纸大小以匹配框架大小

我写了一个应用程序,自定义绘制paint()内的所有内容基于固定的像素位置。 然后我禁用框架的大小调整,使其始终可见。

但是,现在我想能够调整它,但我不想改变我的绘制代码。 我希望我可以抓住300×300平方的Graphics g对象并在我的所有绘制代码​​之后将其调整为JFrame当前大小,但我不知道我在做什么。

这里是示例代码。 在这里我希望100×100平方保持在中间,与resize的JFrame成比例:

package DrawAndScale; import java.awt.Color; import java.awt.Graphics; public class DASFrame extends javax.swing.JFrame { public DASFrame() { setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); this.setSize(300, 300); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new DASFrame().setVisible(true); } }); } @Override public void paint(Graphics g) { g.setColor(Color.BLACK); g.fill3DRect(100, 100, 100, 100, true); } } 

谢谢。

假设您将绘制300×300的方法重命名为paint300,请定义缓冲图像:

 @Override public void paint(Graphics g) { Image bufferImage = createImage(300, 300); // empty image paint300(bufferImage.getGraphics()); // fill the image g.drawImage(bufferImage, 0, 0, null); // send the image to graphics device } 

以上是您想要以全尺寸(300×300)绘制的时间。 如果您的窗口resize:

 @Override public void paint(Graphics g) { Image bufferImage = createImage(300, 300); paint300(bufferImage.getGraphics()); int width = getWidth(); int height = getHeight(); CropImageFilter crop = new CropImageFilter((300 - width)/2, (300 - height)/2 , width, height); FilteredImageSource fis = new FilteredImageSource(bufferImage, crop); Image croppedImage = createImage(fis); g.drawImage(croppedImage, 0, 0, null); } 

新类来自java.awt.image。*。

我没有测试这段代码。 只是向您发送正确的方向。

如果你想绘制自定义颜料然后寻找JLabel或JPanel并在里面包含Icon / ImageIcon ,关于它的简单示例

在此处输入图像描述在此处输入图像描述

在此处输入图像描述

 import java.awt.*; import javax.swing.*; public class MainComponentPaint extends JFrame { private static final long serialVersionUID = 1L; public MainComponentPaint() { setTitle("Customize Preffered Size Test"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void display() { add(new CustomComponent()); pack(); setMinimumSize(getSize()); setPreferredSize(getSize()); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { setVisible(true); } }); } public static void main(String[] args) { MainComponentPaint main = new MainComponentPaint(); main.display(); } } class CustomComponent extends JComponent { private static final long serialVersionUID = 1L; @Override public Dimension getPreferredSize() { return new Dimension(50, 50); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); int w = getWidth(); int h = getHeight(); for (int i = 0; i < Math.max(w, h); i += 20) { g.drawLine(i, 0, i, h); g.drawLine(0, i, w, i); } } } 

不是专家,但您可以缩放Graphics2D对象(传递的Graphics实际上是Graphics2D实例),其中x和y比率是您选择绘制的固定大小与帧的实际大小的比率。

见http://download.oracle.com/javase/6/docs/api/java/awt/Graphics2D.html#scale%28double,%20double%29

你可以用一些数学来做到这一点。

 public void paint(Graphics g){ int height = 100; int width = 100; int x = (this.getWidth() / 2) - (width / 2); int y = (this.getHeight() / 2) - (height / 2); g.setColor(Color.BLACK); g.fill3DRect(x, y, width, height, true); } 

或者如果你想以相同的比例保持盒子的宽度和高度,使用int width = this.getWidth() / 3;int height = this.getHeight() / 3

另一个选择是使用Graphics2D.scale() ,正如JB指出的那样,传递的Graphics对象实际上是一个Graphics2D对象。