Java - Недостающие пиксели в правой части JFrame - PullRequest
0 голосов
/ 26 февраля 2020

Я заметил, что каждый JFrame, который я создаю, не показывает несколько пикселей - ~ 10 пикселей справа. Я не знаю, почему это происходит, но это может быть очень проблематично c для моей игры, если я не исправлю это.

Вот код, с которым я экспериментирую:

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Resizer {

    int width = 500;
    int height = 500;
    JFrame frame;
    JLabel screen;
    BufferedImage image;
    ImageIcon icon;


    public static void main(String[] args) {
        Resizer r = new Resizer();
        r.runCode();
    }


    private void runCode() {
        createFrame();

        javax.swing.Timer t = new javax.swing.Timer(1000/60, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                checkResize();
                drawSomething();
            }
        });

        t.start();
    }


    private void createFrame() {

        frame = new JFrame("Resize Experiment");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        screen = new JLabel();
        screen.setSize(width, height);

        image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        icon = new ImageIcon(image);

        screen.setIcon(icon);
        frame.add(screen);
        frame.pack();

        frame.setVisible(true);
    }


    private void checkResize() {
        if (frame.getWidth() != width || frame.getHeight() != height) {
            screen.setSize(frame.getWidth(), frame.getHeight());
            image = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_INT_ARGB);

            frame.pack();
            width = frame.getWidth();
            height = frame.getHeight();
        }
    }


    private void drawSomething() {
        Graphics2D pen = image.createGraphics();
        pen.setColor(Color.BLACK);
        pen.fillRect(0, 0, width, height);
        pen.setColor(Color.RED);
        pen.drawLine(width, height/2, width-10, height/2);

        addImage();
    }


    private void addImage() {
        icon = new ImageIcon(image);
        screen.setIcon(icon);
    }

}

Я заметил это из-за следующего утверждения:

pen.drawLine(width, height/2, width-10, height/2);

Он должен нарисовать линию от правой стороны JFrame к месту на 10 пикселей дальше слева. На самом деле я не вижу никакой линии вообще. Появляется, когда я поднимаю значение расстояния.

Мой вопрос: почему это происходит и как я могу это исправить?

1 Ответ

0 голосов
/ 27 февраля 2020

Я заметил, что каждый созданный мной JFrame не показывает несколько пикселей - ~ 10 пикселей справа *

Это потому, что вы пытаетесь сделать свой BufferedImage размером с кадр.

Проблема в том, что рамка содержит «границы». Ваше изображение может быть нарисовано только внутри границ.

Вы НЕ должны пытаться сделать BufferedImage размером с рамку.

Как предложено выше, пользовательская живопись должна быть сделана в paintComponent ( ) метод JPanel. Затем вы добавляете панель в рамку. Внутри метода paintComponent () вы можете использовать методы панели getWidth () и getHeight (), чтобы убедиться, что вы рисуете по всей области.

Мне действительно нравится, что с Graphics2D все не так заполнены одним методом, но могут быть разделены

Произвольная отрисовка, выполненная в методе paintComponent (), выполняется с помощью объекта Graphics2D, поэтому вы можете делать все, что захотите. Все компоненты Swing окрашены в методе paintComponent ().

...