Tanslucent Java聊天显示重复的组件



基本上,一旦我使我的JTextArea和JTextField透明,当我键入时,它看起来就像我的所有组件都被复制并添加到屏幕上。是我做错了什么,还是这是NetBeans的错误?

package game;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
*
* @author xDaegothx
*/
public class Game extends JFrame
{
    JLayeredPane LP;
    Game_Chat GC;
    public Game()
    {
        LP = new JLayeredPane();
        LP.setBackground(Color.black);
        LP.setOpaque(true);
        GC = new Game_Chat();
        GC.setBounds(0,350,400,250);
        LP.add(GC);
        this.getContentPane().add(LP);
        this.setBounds(0,0,1200,700);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
    public static void main(String[] args) 
    {
        new Game();
    }
public class Game_Chat extends JLabel
{
    JTextArea TA;
    JScrollPane JSP;
    JTextField TF;
    JButton Submit_btn;
    public Game_Chat()
    {
        TA = new JTextArea();
        TA.setForeground(new Color(255,255,255,0));
        TA.setBackground(new Color(255,255,255,0));
        TA.setOpaque(true);
        TA.setText("Welcome to 'Game'!");
        JSP = new JScrollPane(TA);
        JSP.setOpaque(true);
        JSP.setForeground(new Color(255,255,255,0));
        JSP.setBackground(new Color(255,255,255,0));
        JSP.setBounds(0,0,400,225);
        TF = new JTextField();
        TF.setOpaque(true);
        //TF.setBackground(new Color(255,255,255,0));
        TF.setBounds(0,225,350,25);
        Submit_btn = new JButton("Send");
        Submit_btn.setBorder(null);
        Submit_btn.setBounds(350,225,50,25);
        TF.addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent ae) 
            {
                Submit();
            }
        });
        Submit_btn.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent me)
            {
                Submit();
            }
        });
        add(JSP);
        add(TF);
        add(Submit_btn);
        setBackground(Color.gray);
        setOpaque(true);
    }
    public void Submit()
    {
        String charname = "MyName";
        TA.append("n"+charname+": "+TF.getText());
    }
}

}

将前景和背景都设置为透明有什么意义?如果文本是透明的,您将永远看不到它!

无论如何,要使一个组件完全透明,你不需要处理背景。相反,您只需使用:

textArea.setOpaque(false);

如果你想要部分透明的背景,那么你可以使用setBackground()方法。但是你会有绘画方面的问题。有关问题的解释和一些潜在的解决方案,请参阅透明背景。

此外,您不应该使用setBounds()来设置组件的大小/位置。Swing设计用于布局管理器。因此,花点时间学习如何将它们用于功能更好的程序。

最新更新