6

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

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

这里是示例代码。在此我希望 100x100 的正方形保持在中间,与调整后的 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);
    }
}

谢谢。

4

4 回答 4

3

假设您将绘制 300x300 的方法重命名为 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
}

以上是您想要以全尺寸(300x300)绘制时。如果您的窗口调整大小:

@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.*。

我没有测试这段代码。只是为了把你送到正确的方向。

于 2011-08-19T15:48:11.410 回答
2

如果您想绘制自定义绘画,请查找JLabelJPanel并在其中包含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);
        }
    }
}
于 2011-08-19T15:47:49.243 回答
1

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

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;and int height = this.getHeight() / 3

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

于 2011-08-19T15:23:28.303 回答
1

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

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

于 2011-08-19T15:20:23.713 回答