为了账号安全,请及时绑定邮箱和手机立即绑定

JButton 图像渲染不好

JButton 图像渲染不好

Smart猫小萌 2022-12-15 17:02:18
我正在使用 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);    }}
查看完整描述

2 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

这个对我有用:


注意,我用图片创建了两张图片和图标,一张是按钮的,一张是按下状态的,表示已经按下了。


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();

        }

    }

}


查看完整回答
反对 回复 2022-12-15
?
千万里不及你

TA贡献1784条经验 获得超9个赞

我发现“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


找到解决方案


在 paintComponent 中使用抗锯齿:


@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);

    }


查看完整回答
反对 回复 2022-12-15
  • 2 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号