JButton рендеринг изображения плохо - PullRequest
0 голосов
/ 25 мая 2019

Я делаю приложение с помощью Swing и хочу добавить на главную панель кнопку с крестиком на ней.Но когда я рисую на нем изображение, оно выглядит странно.

Я уже пробовал несколько вещей, таких как изменение размера изображения вне приложения, и крест сделан с помощью IllustratorCC, так что я не думаю, что этокачество исходного изображения, которое является проблемой.

import javax.imageio.*;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

public class ImageRenderingBadly extends JPanel
{
    BufferedImage cross;

    public ImageRenderingBadly()
    {
        try {
            URL url = new URL("https://i.imgur.com/cWGntek.png");
            cross = ImageIO.read(url);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void paintComponent(Graphics g)
    {
        g.drawImage(cross,0,0,null);
    }

    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setSize(new Dimension(200,200));
        frame.setBackground(new Color(0));

        ImageRenderingBadly panel = new ImageRenderingBadly();

        frame.setContentPane(panel);
        frame.setVisible(true);
    }
}

Источник:

image

Рендеринг плохо:

image

НАЙТИ РЕШЕНИЕ

Используйте сглаживание в компоненте краски: (https://docs.oracle.com/javase/tutorial/2d/advanced/quality.html)

@Override
    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D)g;
        RenderingHints rh = new RenderingHints(
                RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g2.setRenderingHints(rh);
        g2.drawImage(cross,0,0,null);
    }

Result

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Это работает для меня:

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

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class XButtonTest {
    private static final String X_IMG_PATH = "https://i.imgur.com/cWGntek.png";

    public static void main(String[] args) {
        try {
            URL xImgUrl = new URL(X_IMG_PATH);
            BufferedImage xImage = ImageIO.read(xImgUrl);
            int w = xImage.getWidth();
            int h = xImage.getHeight();
            BufferedImage pressedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = pressedImg.createGraphics();
            g2.setColor(Color.LIGHT_GRAY);
            g2.fillRect(0, 0, w, h);
            g2.drawImage(xImage, 0, 0, null);
            g2.dispose();

            Icon icon = new ImageIcon(xImage);
            Icon pressedIcon = new ImageIcon(pressedImg);

            JButton button = new JButton(icon);
            button.setPressedIcon(pressedIcon);
            button.setBorderPainted(false);
            button.setFocusPainted(false);
            button.setContentAreaFilled(false);
            JPanel panel = new JPanel();
            panel.add(button);
            JOptionPane.showMessageDialog(null, panel, "Test", JOptionPane.PLAIN_MESSAGE);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
0 голосов
/ 26 мая 2019

Я понял, что "drawImage" плохо отображает изображение, и это проблема, я думаю:


public class Panel extends JPanel
{
    BufferedImage image;

    public Panel() {
        super();

        try {
            image = ImageIO.read(new File("images/BMW-TA.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }
}

Источник: https://i.imgur.com/ebr17CV.jpg

Отображение: https://i.imgur.com/Z01I7mn.png

НАЙТИ РЕШЕНИЕ

Использовать сглаживание в компоненте краски:

@Override
    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D)g;
        RenderingHints rh = new RenderingHints(
                RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g2.setRenderingHints(rh);
        g2.drawImage(cross,0,0,null);
    }
...