2011-10-10 10 views
6

Mam problem podczas ustawiania koloru tła JTextArea po ustawieniu jego tekstu. Kod jest w następujący sposób:Artefakty przy zmianie koloru tła JTextArea

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 

public class Test extends JFrame { 

    private JTextArea area; 

    public Test() { 
     this.setLayout(new BorderLayout()); 
     this.add(this.area = new JTextArea(), BorderLayout.CENTER); 
     this.add(new JButton(clickAction), BorderLayout.SOUTH); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setPreferredSize(new Dimension(500, 200)); 
     this.pack(); 
     this.area.setText("this is just a test"); 
     this.setVisible(true); 
    } 

    Action clickAction = new AbstractAction("Click") { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      area.setBackground(new Color(0, 0, 123, 138)); 
      // repaint(); 
     } 
    }; 

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

Gdybym kliknąć tle zmian JTextArea, ale także trochę artefaktów w polu tekstowym. "Odświeżanie" wydaje się to naprawiać, ale w moim przykładzie zastosowania, to nie pomaga, więc zastanawiałem się, czy istnieje lepsze rozwiązanie tego.

example image

+6

Proszę spojrzeć na blogu Rob Camick w tej [tła z-przejrzystości] (http://tips4java.wordpress.com/2009/ 05/31/tła-z przezroczystością /) –

+0

Świetnie! Właśnie tego szukałem. Dzięki za komentarz. – Max

+0

@EdStaub: Moja "odpowiedź" jest tylko linkiem i dlatego powinna być tylko komentarzem. –

Odpowiedz

-1

miałem ten sam problem z projektem pracowałem na niedawno do szkoły. Musisz też wywołać odświeżenie na ramce (zmieniłem ActionListener, aby wziął JFrame w konstruktorze). Zmieniłem również kod, aby użyć panelu zawartości JFrame. Wydaje mi się, że działa to:

public Test() { 
    this.area = new JTextArea(); 

    this.getContentPane().setLayout(new BorderLayout()); 
    this.getContentPane().add(area, BorderLayout.CENTER); 

    JButton button = new JButton(new MyClickAction(this)); 
    button.setText("Click Me!"); 

    this.getContentPane().add(button, BorderLayout.SOUTH); 

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setPreferredSize(new Dimension(500, 200)); 

    this.area.setText("this is just a test"); 

    this.pack(); 
    this.setVisible(true); 
} 

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

private class MyClickAction extends AbstractAction 
{ 
    private JFrame frame; 

    public MyClickAction(JFrame frame) { 
     this.frame = frame; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     area.setBackground(new Color(0, 0, 123, 138)); 
     frame.repaint(); 
    } 
} 
0

Dzieje się tak, ponieważ używasz częściowo przezroczystego koloru tła komponentu. Spróbuj ustawić wartość kanału alfa koloru tła na 255 i sprawdź, czy artefakty nadal się wyświetlają. Połączenie z numerem repaint() rozwiązuje problem, ponieważ wymusza wypełnienie bufora bazowego kolorem tła przed malowaniem tekstu (chyba).

-1

Miałem podobne problemy i rozwiązałem je, używając metody validate() na danym komponencie. Tak wiele rzeczy może być ... być może uda mi się zaatakować, ale - mówiąc tak, jak ten, który właśnie spędził cały rok na pracy z Swingiem - mówię ci: RUN !! Swing jest prawie przestarzały.

Ucz się JavaFx 2.0 i pomóż pogrzebać Swing.

2

Po prostu brakuje jednego tekstu myślę

Action clickAction = new AbstractAction("Click") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     area.setBackground(new Color(0, 0, 123, 138)); 
     area.repaint(); 
    } 
};