java - 有什么方法可以使用 swing 将背景颜色设置为用户定义的图像吗?

标签 java swing

所以,

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

这很简单。

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

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

该类负责存储用户输入

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 时将背景设置为某种颜色,然后让用户定义要绘制的线条并在初始加载的背景上绘制。

最佳答案

如果需要看到图像背后的背景颜色,请将其设为透明图像。

E.G.而不是:

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

有:

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

关于java - 有什么方法可以使用 swing 将背景颜色设置为用户定义的图像吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50315307/

相关文章:

java - D 是 Java 和 C++ 的可靠替代品吗?

java - 在一个 session 中记录方法调用以便在未来的测试 session 中重播?

java - 在 webapp 之间共享对象时出现 ClassCastError

java - JDK 未本地化 JComponent

java - java中如何计算网站的响应时间

java - OAuth token 请求 - 从 responseentity 获取 access_token

java - 我可以使用 IntelliJ IDEA 将多个 WAR 存档文件部署到本地 Tomcat 吗?

Java 多个拖放面板不起作用

java - 使用java swing实现滑动抽屉动画

java - JFrames 中的 ActionListener