代码之家  ›  专栏  ›  技术社区  ›  user2304843

有没有办法使用swing为用户定义的图像设置背景色?

  •  1
  • user2304843  · 技术社区  · 6 年前

    所以

    我有一个组件,它可以侦听用户输入,并从用户上次单击的位置到他单击的下一个位置绘制图像。

    这很简单。

    问题是我需要在演示文稿上显示这一点,我只想更改此用户定义图像的背景,以避免给人留下这样的印象,即我只是因为懒惰而保留了默认颜色。

    我已经定义了一个浅灰色/默认的配色方案,可以解决这个问题(我正在显示的应用程序比这个更复杂,但这是我唯一的问题),但我希望在背景色方面有更多的自由。

    此类负责存储用户输入

    package stackoverflow;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JComponent;
    /**
    * Component that takes user input
    */
    public class UserDefinedImage extends JComponent {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Image image;
    
    private Graphics2D g2;
    private static Integer  oldX, oldY,tempX,tempY;
    public UserDefinedImage() {
        setDoubleBuffered(false);
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
    
                if (g2 != null) {
                    g2.setPaint(Color.black);
                    // draw line if g2 context not null    
                    if(oldX==null){
                        oldX=e.getX();      
                    }  
                    if(oldY==null){
                        oldY=e.getY();
    
                    }  
    
                    else{
                        tempX=e.getX();
                        tempY=e.getY();
                        g2.drawLine(oldX, oldY, tempX, tempY);
    
                        oldX=tempX;
                        oldY=tempY;
    
                    }
                }
    
                // refresh draw area to repaint
                repaint();
    
    
            }
    
    
    
        });
    }
    
    
    protected void paintComponent(Graphics g) {
        if (image == null) {
            // image to draw null ==> we create
            image = createImage(getSize().width, getSize().height);
            g2 = (Graphics2D) image.getGraphics();
            // enable antialiasing
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    
        }
    
        g.drawImage(image, 0, 0, null);
    }
    
    }
    

    这是我的主窗口,其中包含一个UserDefinedImage面板

    package stackoverflow;
    
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    import java.awt.Color;
    
    public class Main {
    
    private JFrame frame;
    private UserDefinedImage drawing;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main window = new Main();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    /**
     * Create the application.
     */
    public Main() {
        initialize();
    }
    
    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.getContentPane().setBackground(new Color(222, 184, 135));
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        drawing= new UserDefinedImage();
        drawing.setBounds(0, 0, 428, 244);
        //not working
        drawing.setBackground(new Color(250, 235, 215));
        frame.getContentPane().add(drawing);
    
    }
    
    }
    

    TLDR:我有一个接受用户输入的组件,Swing不能像其他组件一样为它提供背景。 我明白为什么swing不能在不覆盖用户输入的情况下为其提供背景。

    我在初始化UserDefinedImage时将背景设置为一种颜色,然后让用户定义要绘制的线,并在最初加载的背景上绘制。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Andrew Thompson    6 年前

    如果需要查看图像后面的背景颜色,请将其设置为 透明的 形象

    E、 G.代替:

    image = createImage(getSize().width, getSize().height);
    

    拥有:

    image = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB));