2017-09-28 5 views
0

質問は本当に、私はJTextFieldの背景を半透明にしたいと思います。私はそれをフラッシュさせるためにタイマーを使用しています。JTextFieldを半透明にしてください

私は伝統的なtextField.setBackground()を使用すると、それぞれのフラッシュでテキストフィールドが暗くなるという奇妙なグラフィックグリッチが発生することが分かりました。いくつかは、私はテキストフィールドが不透明に設定することをお勧めします、また

name = new JTextField(15) { 
     @Override 
     protected void paintComponent(Graphics g) { 
      g.setColor(this.getBackground()); 
      g.fillRect(getX(), getY(), getWidth(), getHeight()); 
      super.paintComponent(g); 
     } 
    }; 

strange graphical glitch

だから、オンラインで検索した後、私は次のコードでのJTextFieldのペイントメソッドをオーバーライドしてみました(下記参照) booleanをfalseにします。これは私がやったと無駄に、今でも任意の赤い点滅がないと私は単純にこれを取得:それはここに、役立ちます私はフィールドが点滅するために使用していたコードである

fields with field.setOpaque(false);

念のため。

public void flashField(JTextField field, Color flashColor, final int flashDelay, final int numberOfFlashes) { 
    timers.add(new Timer(flashDelay, new ActionListener() { 

     int counter = 0; 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      counter++; 
      if (counter % 2 == 0) 
       field.setBackground(
         new Color(flashColor.getRed(), flashColor.getBlue(), flashColor.getGreen(), 50)); 
      else 
       field.setBackground(Color.WHITE); 

      if (counter == (numberOfFlashes * 2) + 1) { 
       ((Timer) e.getSource()).stop(); 
      } 

      field.repaint(); 
     } 
    })); 

    timers.get(timers.size() - 1).start(); 

} 

答えて

0

Textfieldが200msごとに点滅し続け、透明である適応コードです。

import java.awt.AlphaComposite; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TransparentTextFieldExample { 
public static void main(String[] args) { 
    new TransparentTextFieldExample(); 
} 

public TransparentTextFieldExample() { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
      } 

      JFrame frame = new JFrame("Testing"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLayout(new BorderLayout()); 
      JPanel panel = new JPanel(); 
      panel.setLayout(new GridBagLayout()); 
      TransparentTextField ttf = new TransparentTextField("Some text!", 20); 
      panel.add(ttf); 
      frame.add(panel); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
      flashField(ttf, Color.RED, 1, 20); 
     } 
    }); 

} 

public void flashField(JTextField field, java.awt.Color flashColor, final int flashDelay, final int numberOfFlashes) { 

    Timer tm = new Timer(flashDelay, new ActionListener() { 

     int counter = 0; 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (counter % 2 == 0) { 
       field.setBackground(flashColor); 
      } else { 
       field.setBackground(Color.WHITE); 
      } 
      if (counter == (numberOfFlashes * 2) + 1) { 
       System.out.println("Inside"); 
       //((Timer) e.getSource()).stop(); 
       // break; 
      } 

      field.repaint(); 
      try { 
       Thread.sleep(200l); 
      } catch (Exception ex) { 
      } 
      counter++; 
     } 
    }); 
    tm.start(); 

} 

public class TransparentTextField extends JTextField { 

    public TransparentTextField(String text) { 
     super(text); 
     init(); 
    } 

    public TransparentTextField(int columns) { 
     super(columns); 
     init(); 
    } 

    public TransparentTextField(String text, int columns) { 
     super(text, columns); 
     init(); 
    } 

    protected void init() { 
     setOpaque(false); 
    } 

    @Override 
    public void paint(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f)); 
     super.paint(g2d); 
     g2d.dispose(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setColor(getBackground()); 
     g2d.fillRect(0, 0, getWidth(), getHeight()); 
     super.paintComponent(g2d); 
     g2d.dispose(); 
    } 

} 
} 
0

だから、オンラインで検索した後、私はいくつかは、私はfalseにテキストフィールド不透明なブール値を設定することをお勧めします、また、塗装方法

を上書きしようとしました。

この両方を同時に行う必要があります。ような何か:Background With Transparencyこれが必要な理由のために、あなたがカスタムやったびに塗装することなく、任意のコンポーネントに使用できる簡単な再利用可能なソリューションのための

JPanel panel = new JPanel() 
{ 
    protected void paintComponent(Graphics g) 
    { 
     g.setColor(getBackground()); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     super.paintComponent(g); 
    } 
}; 
panel.setOpaque(false); // background of parent will be painted first 
panel.setBackground(new Color(255, 0, 0, 20)); 
frame.add(panel); 

チェックアウト。

関連する問題