Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPanel中保持纵横比_Java_Swing_Graphics_Jpanel_Aspect Ratio - Fatal编程技术网

Java 如何在JPanel中保持纵横比

Java 如何在JPanel中保持纵横比,java,swing,graphics,jpanel,aspect-ratio,Java,Swing,Graphics,Jpanel,Aspect Ratio,在我的JPanel上,我有点难以维持纵横比 我已经从带有边框布局的Netbeans中默认生成了JFrame。整个框架充满了我的JPanel(来自我的自定义类GraphicsPanel.java扩展JPanel) GraphicsPanel类只有一个使用一些基本构造函数绘制图形的方法。我的JPanel上有一个矩形和多边形。 我试图实现的是,当我重新调整帧的大小时,我希望使我的JPanel的纵横比保持在4:3(或类似的比例)。当帧对于纵横比来说太大时,它将用一些默认颜色填充帧背景 我读过一些关于纵横

在我的
JPanel
上,我有点难以维持纵横比

我已经从带有边框布局的Netbeans中默认生成了
JFrame
。整个框架充满了我的
JPanel
(来自我的自定义类GraphicsPanel.java扩展
JPanel

GraphicsPanel类只有一个使用一些基本构造函数绘制图形的方法。我的
JPanel上有一个矩形和多边形。
我试图实现的是,当我重新调整帧的大小时,我希望使我的
JPanel
的纵横比保持在4:3(或类似的比例)。当帧对于纵横比来说太大时,它将用一些默认颜色填充帧背景

我读过一些关于纵横比的主题(例如)。但是运气不好,我仍然不知道怎么做

这是我的
JPanel
课程中的代码。我是初学者,我正在尝试学习如何使用Java图形(绘制、填充、调整大小等),所以请对我放松

import java.awt.Color;
import java.awt.Graphics;
public class GraphicsPanel extends javax.swing.JPanel {

private int x;
private int z;
private int y;

public GraphicsPanel() { //constructor
    initComponents();
    x = getHeight() / 2;
    z = getWidth() / 2;
    y = getHeight() - 1;
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

        x = getHeight() / 2;
        z = getWidth() / 2;
        y = getHeight() - 1;

    setBackground(new Color(255, 255, 255));

    g.setColor(Color.red);
    g.fillRect(0, x, getWidth() - 1, y);

    g.setColor(Color.blue);
    int[] poleX = {0, 0, z};
    int[] poleY = {0, y, x};
    g.fillPolygon(poleX, poleY, 3);
  }
}

我认为你想要的是在你的面板上画出你的图像(看起来很像捷克国旗!),而不是填满所有的空间。例如,如果帧很宽,图像将不会填充整个宽度。如果我理解正确,这并不难

在代码中,您可以获得面板的宽度和高度。完成后,做一些算术。如果纵横比“太宽”,则图像将填充高度,否则将填充宽度。现在你知道了一个维度,所以你可以计算另一个维度,你只需要画一个足够大的图像来适应这些维度

编辑:计算示例

if panel width / panel height > 4 / 3
    // too wide
    // use panel height as image height
    // calculate image width from image height
else
    // use panel width as image width
    // calculate image height from image width
面板的大小和形状很难(不可能?)固定。您必须将面板添加到容器中(在您的示例中为JFrame,但可以是任何内容),容器将使用布局管理器设置面板大小


我需要维护我正在绘制的图像(但我想维护组件的比率会更容易)。因为我的图像不是经典的图像(png,jpg),而是来自draw/fill的一些看起来像图像的形状

您可以轻松地创建一个大小合理、纵横比合适的
buffereImage
,并在BuffereImage上绘制图形

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();

//  paint image background

g2d.setColor( ... );
g2d.fillRect(0, 0, width, height);

//  draw shapes

g2d.fillOval(....);
您可以使用Darryls在JLabel中显示图像。
StretchIcon
类将在标签可用空间内按比例缩放图标:

JLabel label = new JLabel( new StretchIcon(image) );
frame.add(label);

您希望图像或组件保持它的比率吗?我需要保持我正在绘制的图像(但我想保持组件的比率会更容易)。因为我的图像不是经典图像(png,jpg),而是draw/fill中看起来像图像的一些形状。“我需要维护我正在绘制的图像(但我想维护组件的比率会更容易)。”我使用
AffineTransform
实例的组合多次这样做。第二次我只试过一次,在。我推荐第一种方法,而不是第二种方法。我想你会发现保持你画的内容与控制布局的比例更容易。我已经试过了,但没有成功。我已经走到了死胡同,我不知道如何继续下去。我尝试了一些if语句和侦听器,但很奇怪。是的,这正是我需要的。是的,这是捷克国旗:)我知道这并不难,但我在设置填充/计算维度的条件时遇到了困难。我添加了计算示例。是的!这正是我所需要的。简单快捷的学习解决方案。非常感谢您的计算和提示!这正是我想要的:)谢谢你的努力,但我认为这对我来说太高级了:)@Shocky,我不知道怎么会太高级,因为你不需要做任何特别的事情。你所要做的就是把国旗画成一个给定的尺寸。剩下的由StretchIcon完成。与您现在使用的解决方案相比,它是一个更简单、更可重用的解决方案。虽然我同意您可能希望使用当前的方法(作为学习工具),但您仍然应该理解这种方法,因为它展示了创建/使用可重用代码的能力。因此,我建议您也使用这种方法来了解这两种方法的区别/好处。当然,我也会看看您的方法。但我从未使用过Strechon或BuffereImage,因此我想要一些简单的解决方案。
我想要一些简单的解决方案。
-如果你不同时尝试这两种方法,你怎么知道什么是简单的?我给了你BuffereImage的代码。在BuffereImage上绘制与在paintComponent()方法中绘制没有什么不同。