2016-06-20 15 views
1

コードの背後にあるアイデアは、2つの数字を生成する簡単な乗算ゲームで、私はcorret答えを入力する必要があります。JLabelパネルの不透明度と一般的な背景の色付け

基本的に、私の質問(複数可)されて(さ):

  1. 私はoperacao.setOpaque(false)を行います。それは何もしません、または少なくとも私がそれが(灰色の領域がピンクでなければならない、http://puu.sh/pyVcE/813aa1843a.pngは、バックグラウンドがピンクであると思いますか?)。 JLabelsでも同様ですが、setOpaque(false)は(この場合は)数字の背後に灰色の背景を残します。
  2. ペイントメソッドを変更すると言っている人がいましたが、それはうまくいっていましたが、奇妙な問題が発生しました。(コンソールを起動したときにすべてのペイントが行われ、JTextFieldだけがクリアsetOpacity(1)で「固定」します。 setBackground(ピンク); - これはこれを行う正しい方法ですか?

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!"); 
     setOpacity(1); 
     setBackground(pink); 

     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 
     setSize(300, 200); 

     panel = new JPanel(); 
     mensagem = new JPanel(); 
     operacao = new JPanel(); 
     mensagem.setLayout(new FlowLayout(FlowLayout.CENTER)); 
     operacao.setLayout(new FlowLayout(FlowLayout.CENTER)); 

     sucesso = new JTextArea(); 
     sucesso.setEditable(false); 
     sucesso.setOpaque(false); 
     sucesso.setFont(minhaFont2); 

     Random randomGen = new Random(); 

     while (random1 == 0) 
      random1 = randomGen.nextInt(10); 
     while (random2 == 0) 
      random2 = randomGen.nextInt(10); 
     res = random1 * random2; 

     numero1 = new JLabel(); 
     numero2 = new JLabel(); 
     numero1.setText(random1 + " *"); 
     numero2.setText(random2 + " ="); 
     numero1.setOpaque(false); 
     numero1.setFont(minhaFont); 
     numero2.setFont(minhaFont); 

     resposta = new JTextField(2); 
     resposta.addActionListener(new MinhaAcao()); 
     resposta.setFont(minhaFont); 

     operacao.add(numero1); 
     operacao.add(numero2); 
     operacao.add(resposta); 

     mensagem.add(sucesso); 

     operacao.setOpaque(true); 
     operacao.setBackground(pink); 
     mensagem.setOpaque(true); 
     mensagem.setBackground(pink); 

     //add(panel, BorderLayout.NORTH); 
     add(operacao); 
     add(mensagem, BorderLayout.SOUTH); 

    }/* 
    public void paint(Graphics g) { 
     g.setColor(pink); 
     g.fillRect(0, 0, this.getWidth(), this.getHeight()); 
    }*/ 
+1

1)すぐに役立つようにするには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 2)コアクラスの名前を反映しないカスタムクラスには、分かりやすい名前を使用してください! –

答えて

3

あなたがピンク色であることをテキストフィールドにする必要があります。あなたはこれをしなければならないかもしれません。

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に

  1. 設定の背景です。
  2. 透明パネルを作成しました(パネルの不透明度をfalseに設定)。
  3. JTextfieldのOpaqueをfalseに設定します。
+0

ああ、それはそれを固定しました、ありがとう!小さな質問ですが、この新しいクラスは、例えば、 パネル=新しいJPanel(); panel.setOpaque(false); 私は違いを見つけるのが難しいので、たぶん私はちょうど何か最初に間違っていましたか?とにかくありがとう! – ASDF

+0

@ASDF何か定型コードを避けるだけです。同じ属性を共有するパネルが多数あるとします。 – Beniton

関連する問題