Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 不使用JLabel调整图像大小_Java_Swing - Fatal编程技术网

Java 不使用JLabel调整图像大小

Java 不使用JLabel调整图像大小,java,swing,Java,Swing,我正在写一个类似河流袭击的游戏,所有的图像都是用g.drawImage(…)绘制的。 我的问题是:当有人调整JFrame的大小时,如何保持内容的纵横比,并调整内容以适应新的窗口大小 有这样的选择吗?我可以在不使用JLabel和布局的情况下执行此操作吗?如果没有,如何以其他方式进行 我在JPanel上画东西的代码 private void doDrawing(Graphics g) { Graphics2D g2 = (Graphics2D) g; drawStr

我正在写一个类似河流袭击的游戏,所有的图像都是用g.drawImage(…)绘制的。 我的问题是:当有人调整JFrame的大小时,如何保持内容的纵横比,并调整内容以适应新的窗口大小

有这样的选择吗?我可以在不使用JLabel和布局的情况下执行此操作吗?如果没有,如何以其他方式进行

我在JPanel上画东西的代码

 private void doDrawing(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        drawStrings(g2);
        mapa.drawMap(g2);
        ArrayList ms = craft.getMissiles();

        for (Object m1 : ms) {
            Missile m = (Missile) m1;
            g2.drawImage(m.getImage(), m.getX(), m.getY(), this);
        }
        g2.drawImage(craft.getImage(), craft.getX(), craft.getY(), this);
        for (EnemyJet enemy : enemies) {
            g2.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), this);
        }
        for (Fuel fuel : fuels) {
            g2.drawImage(fuel.getImage(), fuel.getX(), fuel.getY(), fuel.getHeight(), fuel.getHeight(), this);
        }
        for (Obstacle o : obst) {
            g2.drawImage(o.getImage(), o.getX(), o.getY(), this);
        }
        drawStrings(g2);
    }
此外,Jpanel构造函数:

  private void initBoard() {
        addKeyListener(new TAdapter());
        setFocusable(true);
        setBackground(Color.WHITE);
        setLayout(new GridBagLayout());
        craft = new Craft(ICRAFT_X, ICRAFT_Y);
        mapa = new Mapa();
        setMinimumSize(new Dimension(WIDTH, HEIGHT));
        initEnemiesAndAddThem();
        czas = new Timer(delay, this);
        czas.start();
    }
 private void initGame()
    {
        add(new Plansza());
        setTitle("Reeevah Raaid");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(WIDTH, HEIGHT);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setLocationRelativeTo(null);
        pack();
        setVisible(true);
        //setExtendedState(JFrame.MAXIMIZED_BOTH);
        //setResizable(false);
    }
JFrame构造函数:

  private void initBoard() {
        addKeyListener(new TAdapter());
        setFocusable(true);
        setBackground(Color.WHITE);
        setLayout(new GridBagLayout());
        craft = new Craft(ICRAFT_X, ICRAFT_Y);
        mapa = new Mapa();
        setMinimumSize(new Dimension(WIDTH, HEIGHT));
        initEnemiesAndAddThem();
        czas = new Timer(delay, this);
        czas.start();
    }
 private void initGame()
    {
        add(new Plansza());
        setTitle("Reeevah Raaid");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(WIDTH, HEIGHT);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setLocationRelativeTo(null);
        pack();
        setVisible(true);
        //setExtendedState(JFrame.MAXIMIZED_BOTH);
        //setResizable(false);
    }

任何图像都需要按如下方式绘制:

  double fct=1.0*image.getWidth()/getWidth();
  double fct2=1.0*image.getHeight()/getHeight();
  if(fct2>fct) fct=fct2;
  g2.drawImage(image, x, y, (int)(1.0*image.getWidth()/fct), (int)(1.0*image.getHeight()/fct), this);
这将留下大量的空白区域,但如果你想保持纵横比的话

--

要使图像居中,请执行以下操作:

int newWidth=(int)(1.0*image.getWidth()/fct);
int newHeight=(int)(1.0*image.getHeight()/fct);
g2.drawImage(image, getWidth()/2-newWidth()/2, getHeight()/2-newHeight()/2, newWidth, newHeight, this);

您可以缩放整个对象:

private void doDrawing(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;

    AffineTransform originalTransform = g2.getTransform();
    g2.scale(getWidth() / (double) WIDTH, getHeight() / (double) HEIGHT);

    // Do all drawing here

    g2.setTransform(originalTransform);
}
一些注意事项:

  • 最后的
    g2.setTransform(originalTransform)
    很重要。图形对象不属于您,它可能用于绘制其他组件,因此您需要使其保持与提供给您时相同的状态
  • 宽度和高度需要转换为double,因为在Java中,如果除法运算的任何操作数是double,则结果是double,但如果它们都是int,则执行整数除法,这绝对不是您想要的。(例如,
    3/(double)2
    是1.5,但
    3/2
    正好是1。)

效果很好,因为它实际上调整了可视部分的大小。我从图像中获取的矩形边界有一个问题,它们没有更改。你能告诉我怎么做吗?另外,内容是向左浮动的,你能告诉我如何将jpanel居中吗?很抱歉,但它不起作用,因为比例可能非常大,也可能太小,因为只有一个背景可见,但交叉点出现,证明它们在某个地方可见(图像)。我喜欢这种方法,因为它适用于do drawing中的所有图像,但最后scaleEDIT出现了一些问题:经过一些研究,出现了交互,但没有可见的图像。。。我试着将比例乘以0.5或2,看看它是否会使图像太小或太大,以至于我看不见它们,但它们是不可见的。。。