我写了一个应用程序,自定义根据固定的像素位置绘制paint()内的所有内容。然后我禁用了帧的大小调整,因此它始终可见。
但是,现在我想能够调整它的大小,但我不想改变我的绘图代码。我希望我能抓住300x300平方的Graphics g对象,并在我的所有绘制代码之后将其调整为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);
}
}
感谢。
答案 0 :(得分: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。*。
我没有测试这段代码。只是为了让你朝着正确的方向前进。
答案 1 :(得分:2)
如果你想绘制自定义颜料,那么在里面寻找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);
}
}
}
答案 2 :(得分:1)
不是专家,但您可以缩放Graphics2D对象(传递的Graphics实际上是Graphics2D实例),其中x和y比率是您选择绘制的固定大小与实际大小的比率。帧。
请参阅http://download.oracle.com/javase/6/docs/api/java/awt/Graphics2D.html#scale%28double,%20double%29
答案 3 :(得分: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;
和int height = this.getHeight() / 3
。
另一个选择是使用Graphics2D.scale()
,正如JB指出的那样,传递的Graphics
对象实际上是一个Graphics2D
对象。