Java JLabel面板不透明度和一般背景颜色

Java JLabel面板不透明度和一般背景颜色,java,swing,jframe,opacity,Java,Swing,Jframe,Opacity,代码背后的想法是一个简单的乘法游戏,它生成2个数字,我必须输入正确的答案 基本上,我的问题是: 当我操作时,设置不透明(false);它什么也不做,或者至少不是我期望它做的(灰色区域不应该是粉红色的,因为背景是粉红色的吗?)。同样的情况也发生在JLabels上,setOpaque(false)在(本例中)数字后面留下灰色背景 我有最后一个评论部分,因为我看到有人在这里说要改变绘制方法,它确实有效,但引起了一些奇怪的问题(当我启动控制台时,在所有内容上绘制,只有JTextField是清晰的),然后

代码背后的想法是一个简单的乘法游戏,它生成2个数字,我必须输入正确的答案

基本上,我的问题是:

  • 当我操作时,设置不透明(false);它什么也不做,或者至少不是我期望它做的(灰色区域不应该是粉红色的,因为背景是粉红色的吗?)。同样的情况也发生在JLabels上,setOpaque(false)在(本例中)数字后面留下灰色背景
  • 我有最后一个评论部分,因为我看到有人在这里说要改变绘制方法,它确实有效,但引起了一些奇怪的问题(当我启动控制台时,在所有内容上绘制,只有JTextField是清晰的),然后我用setOpacity(1)来“修复”它;挫折背景(粉红色);-这是正确的做法吗


  • 您需要将文本字段设置为粉红色。你可能必须这样做

    resposta.setOpaque(false);
    
    我已经像下面那样重构了你的代码

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.util.Random;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    
    public class Frame extends JFrame {
    
        private JPanel panel, mensagem, operacao;
        private JTextArea sucesso;
        private JLabel numero1, numero2;
        private JTextField resposta;
        private Color pink = new Color(255, 213, 224);
        //more vars
    
        public Frame() {
            super("Jogo de Multiplicar!");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLayout(new BorderLayout());
            setSize(300, 200);
            getContentPane().setBackground(pink);
            panel = new TransperantPanel();
            mensagem = new TransperantPanel();
            operacao = new TransperantPanel();
            mensagem.setLayout(new FlowLayout(FlowLayout.CENTER));
            operacao.setLayout(new FlowLayout(FlowLayout.CENTER));
    
            sucesso = new JTextArea();
            sucesso.setEditable(false);
    
            Random randomGen = new Random();
            int random1 =0 , random2 = 0;   
            while (random1 == 0)
                random1 = randomGen.nextInt(10);
            while (random2 == 0)
                random2 = randomGen.nextInt(10);
            int res = random1 * random2;
    
            numero1 = new JLabel();
            numero2 = new JLabel();
            numero1.setText(random1 + " *");
            numero2.setText(random2 + " =");    
    
    
            resposta = new JTextField(2);
            resposta.setOpaque(false);
            resposta.addActionListener(new MinhaAcao());
            numero1.setFont(minhaFont);
            numero2.setFont(minhaFont);
            resposta.setFont(minhaFont);
    
            operacao.add(numero1);
            operacao.add(numero2);
            operacao.add(resposta);
    
            mensagem.add(sucesso);
    
            add(operacao);
            add(mensagem, BorderLayout.SOUTH);
    
        }
    
        public static void main(String[] args){
            Frame f = new Frame();
            f.setVisible(true);
        }
    
        class TransperantPanel extends JPanel {
    
            public TransperantPanel() {
                setOpaque(false);
            }
    
        }
    }
    
    我所做的是

  • 将背景设置为框架的contentPane
  • 创建了一个透明面板(将面板的不透明设置为false)
  • 将JTextfield的不透明设置为false

  • 1) 为了更快地获得更好的帮助,请发布一个or。2) 对不镜像核心类名称的自定义类使用合理的名称!是的,修好了,非常感谢!尽管有一些小问题,但当这个新类被引入时有什么不同,例如panel=newjpanel();面板。设置不透明(假);因为我很难找到区别。也许我第一次就做错了什么?无论如何谢谢你@ASDF没有做任何事情,只是避免一些样板代码。假设有许多面板共享相同的属性。
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.util.Random;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    
    public class Frame extends JFrame {
    
        private JPanel panel, mensagem, operacao;
        private JTextArea sucesso;
        private JLabel numero1, numero2;
        private JTextField resposta;
        private Color pink = new Color(255, 213, 224);
        //more vars
    
        public Frame() {
            super("Jogo de Multiplicar!");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLayout(new BorderLayout());
            setSize(300, 200);
            getContentPane().setBackground(pink);
            panel = new TransperantPanel();
            mensagem = new TransperantPanel();
            operacao = new TransperantPanel();
            mensagem.setLayout(new FlowLayout(FlowLayout.CENTER));
            operacao.setLayout(new FlowLayout(FlowLayout.CENTER));
    
            sucesso = new JTextArea();
            sucesso.setEditable(false);
    
            Random randomGen = new Random();
            int random1 =0 , random2 = 0;   
            while (random1 == 0)
                random1 = randomGen.nextInt(10);
            while (random2 == 0)
                random2 = randomGen.nextInt(10);
            int res = random1 * random2;
    
            numero1 = new JLabel();
            numero2 = new JLabel();
            numero1.setText(random1 + " *");
            numero2.setText(random2 + " =");    
    
    
            resposta = new JTextField(2);
            resposta.setOpaque(false);
            resposta.addActionListener(new MinhaAcao());
            numero1.setFont(minhaFont);
            numero2.setFont(minhaFont);
            resposta.setFont(minhaFont);
    
            operacao.add(numero1);
            operacao.add(numero2);
            operacao.add(resposta);
    
            mensagem.add(sucesso);
    
            add(operacao);
            add(mensagem, BorderLayout.SOUTH);
    
        }
    
        public static void main(String[] args){
            Frame f = new Frame();
            f.setVisible(true);
        }
    
        class TransperantPanel extends JPanel {
    
            public TransperantPanel() {
                setOpaque(false);
            }
    
        }
    }