2017-02-19 2 views
0

textArea.setBackground(Color.RED); können Sie eine bestimmte Farbe in sie hinzufügen, aber was ist, wenn ich einen Gradient Farbe esWie Hintergrund Hintergrund zu JTextArea hinzufügen?

auch der Code hinzufügen möchten als

public class IncomingTextArea extends JTextArea { 

IncomingTextArea(int width,int height){ 
    super(width,height); 
} 
@Override 
public void paintComponent(Graphics g) { 

    Graphics2D g2D = (Graphics2D) g; 

    int red = (int) Math.random() * 255; 
    int green = (int) Math.random() * 255; 
    int blue = (int) Math.random() * 255; 
    Color startColor = new Color(red, green, blue); 

    red = (int) Math.random() * 255; 
    green = (int) Math.random() * 255; 
    blue = (int) Math.random() * 255; 
    Color endColor = new Color(red, green, blue); 

    GradientPaint gradientPaint = new GradientPaint(70, 70, startColor, 150, 150, endColor); 
    g2D.**??** 
    super.paintComponent(g2D); 

} 

}

folgt aber ich kann einfach nicht die richtige Methode finden Gradient Wert zuweisen. gut .paint(gradientPaint) funktioniert für Formen und Sachen, aber was ist mit ganzen textArea?

Antwort

2

Ich lag falsch - erweitern Sie nicht JTextArea, sondern erweitern Sie den JViewport des JScrollPane, das Ihre JTextArea enthält, zeichnen Sie innerhalb seiner paintComponent-Methode, und stellen Sie sicher, dass Ihre JTextArea nicht opak ist.

Also würde ich das Ansichtsfenster wie so erweitern:

import java.awt.Color; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JViewport; 

public @SuppressWarnings("serial") class GradientViewport extends JViewport { 
    private Color c1; 
    private Color c2; 

    public GradientViewport(Color c1, Color c2) { 
     this.c1 = c1; 
     this.c2 = c2; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     GradientPaint gPaint = new GradientPaint(0, 0, c1, getWidth(), getHeight(), c2, false); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setPaint(gPaint); 
     g2.fillRect(0, 0, getWidth(), getHeight()); 
    } 

} 

wieder, die Gradienten innerhalb des paintcomponent-Methode des Ansichtsfensters zeichnen.

Ich würde es dann wie so verwenden:

import java.awt.Color; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

@SuppressWarnings("serial") 
public class GradientTextAreaTest extends JPanel { 
    public static final Color C1 = new Color(255, 200, 200); 
    public static final Color C2 = new Color(200, 200, 255); 
    private JTextArea textArea = new JTextArea(30, 40); 

    // create the view port with colors passed into it 
    private GradientViewport viewport = new GradientViewport(C1, C2); 
    private JScrollPane scrollPane = new JScrollPane(); 

    public GradientTextAreaTest() { 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 

     // make the JTextArea transparent 
     textArea.setOpaque(false); 

     // set the viewport's view with your JTextArea 
     viewport.setView(textArea); 

     // set the JScrollPane's viewport with our viewport object 
     scrollPane.setViewport(viewport); 

     // add the JScrollPane to our GUI 
     add(scrollPane); 
    } 

    private static void createAndShowGui() { 
     GradientTextAreaTest mainPanel = new GradientTextAreaTest(); 

     JFrame frame = new JFrame("GradientTextAreaTest"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

} 

Oder diese anzuzeigen: wie so

enter image description here

Verwenden Sie die obige Klasse:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

@SuppressWarnings("serial") 
public class GradientTextAreaTest extends JPanel { 
    public static final String TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt " 
      + "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " 
      + "aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu " 
      + "fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit " 
      + "anim id est laborum."; 
    public static final int FILLER = 130; 
    public static final Color C1 = new Color(255, FILLER, FILLER); 
    public static final Color C2 = new Color(FILLER, FILLER, 255); 
    private JTextArea textArea = new JTextArea(14, 30); 

    // create the view port with colors passed into it 
    private GradientViewport viewport = new GradientViewport(C1, C2); 
    private JScrollPane scrollPane = new JScrollPane(); 

    public GradientTextAreaTest() { 
     setLayout(new BorderLayout()); 
     textArea.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 32)); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
     for (int i = 0; i < 10; i++) { 
      textArea.append(TEXT + "\n"); 
     } 

     // make the JTextArea transparent 
     textArea.setOpaque(false); 

     // set the viewport's view with your JTextArea 
     viewport.setView(textArea); 

     // set the JScrollPane's viewport with our viewport object 
     scrollPane.setViewport(viewport); 

     // add the JScrollPane to our GUI 
     add(scrollPane); 
    } 

    private static void createAndShowGui() { 
     GradientTextAreaTest mainPanel = new GradientTextAreaTest(); 

     JFrame frame = new JFrame("GradientTextAreaTest"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

} 
+0

gerade den Beitrag bearbeitet, können Sie den 'QuestionMark' füllen? –

+0

@ D4G4: Was? Ich habe die obige Antwort gepostet. Es gibt nichts, was Sie in dem Fragezeichen tun können, das Ihr Problem als ** wieder ** lösen wird. Die Lösung besteht darin, das Ansichtsfenster von JScrollPane und nicht die JTextArea zu überschreiben. –

+1

@HovercraftFullOfEels Nun, Sie könnten entweder abhängig von dem, was Sie erreichen möchten, als ein Beispiel (http://stackoverflow.com/questions/13677850/add-background-image-in-table/13678077#13678077) verwenden a 'JTable';) – MadProgrammer

0

Verfahren erzählt von @ Hovercraft Full Of Aalen ist ziemlich gut

Nun, ich habe eine andere Lösung gefunden. Malen Sie das Rechteck oder ein anderes Objekt mit dem Farbverlauf wie gewohnt dh g2D.setPaint(gradientPaint); g2D.fillRect(0, 0, getWidth(), getHeight());

und dann textArea.setOpaque(false);

Art des Hits und Probe Ich weiß: p

Aber dank @Hovercraft Full Of Eels

+1

Vorher für oder nach dem Aufruf von' super.paintComponent'? Der Text des Textbereichs ist mit 'paintComponent' bemalt, so dass Sie den Text löschen können, wenn Sie nicht vorsichtig sind - wie [demonstriert] (http://stackoverflow.com/questions/26386422/how-to-set-background) -Image-zu-einem-Text-in-a-jpanel/26391459 # 26391459) – MadProgrammer

+0

Wird RGB-Werte größer als 150 .. Nun, das war einfach eine Client-Server-Text-Chat-Anwendung .. Ich habe nur Sachen aus meinem eigenen .. Ich bin nur eine Zwischenstufe. Also :) –

Verwandte Themen