2015-12-22 110 views
1

我要让JTextArea中有一个圆角,而我这样做代码:的JTextArea圆角

public BPosTxtArea() { 
    super(); 
    setOpaque(false); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g.create(); 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.setColor(getBackground()); 
    g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 15, 15); 
    super.paintComponent(g); 
} 

@Override 
protected void paintBorder(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g.create(); 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.setColor(new Color(102, 102, 102)); 
    g2.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 15, 15); 
} 

但它仍然有一个正方形边框外面像图片波纹管:

enter image description here

谁能帮我?

+3

您是否将文本区域添加到JScrollPane?也许你正在看到滚动窗格的边框。发布一个合适的[SSCCE](http://sscce.org/)来说明问题。 – camickr

+0

不,我只是想要它有圆角 –

+0

*“我只是想要它有圆角”*只需发布[mcve]或SSCCE。投票结束。 –

回答

4

开始由具有看看How to Use Borders

这是一个很简单的例子:

public class RoundBorder implements Border { 

    private int radius; 

    public RoundBorder(int radius) { 
     this.radius = radius; 
    } 

    public int getRadius() { 
     return radius; 
    } 

    @Override 
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.draw(new RoundRectangle2D.Double(x, y, width - 1, height - 1, getRadius(), getRadius())); 
     g2d.dispose(); 
    } 

    @Override 
    public Insets getBorderInsets(Component c) { 
     int value = getRadius()/2; 
     return new Insets(value, value, value, value); 
    } 

    @Override 
    public boolean isBorderOpaque() { 
     return false; 
    } 

} 

Rounded Border

import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.geom.RoundRectangle2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.Border; 

public class Example { 

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

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

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      JTextArea ta = new JTextArea(10, 20); 
      ta.setBorder(new RoundBorder(20)); 

      JScrollPane sp = new JScrollPane(new JTextArea(10, 20)); 
      sp.setBorder(new RoundBorder(20)); 

      add(ta, gbc); 
      add(sp, gbc); 
     } 

    } 

    public class RoundBorder implements Border { 

     private int radius; 

     public RoundBorder(int radius) { 
      this.radius = radius; 
     } 

     public int getRadius() { 
      return radius; 
     } 

     @Override 
     public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.draw(new RoundRectangle2D.Double(x, y, width - 1, height - 1, getRadius(), getRadius())); 
      g2d.dispose(); 
     } 

     @Override 
     public Insets getBorderInsets(Component c) { 
      int value = getRadius()/2; 
      return new Insets(value, value, value, value); 
     } 

     @Override 
     public boolean isBorderOpaque() { 
      return false; 
     } 

    } 

} 

问题,则绘制边框 “中的” 分量填充区域,这意味着角落的颜色与填充区域相同。使用Border无法绕过它。

诀窍是创建第二个组件,在其上可以绘制边框(通过paintComponent,边框内的区域填充与文本区域相同的颜色),然后将组件添加到边框中。

更新

基于您的代码示例,你没有覆盖getInsets,这将是非常重要的,其他的事情是,我们发现您的JTextArea不到JScrollPane ...

Comparison

public class BPosTextArea extends JTextArea { 

    private int radius; 

    public BPosTextArea() { 
     super(10, 20); 
     setOpaque(false); 
     setBorder(null); 
     setRadius(20); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(getBackground()); 
     g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, getRadius(), getRadius()); 
     super.paintComponent(g); 
    } 

    @Override 
    protected void paintBorder(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(new Color(102, 102, 102)); 
     g2.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, getRadius(), getRadius()); 
    } 

    public void setRadius(int radius) { 
     this.radius = radius; 
     repaint(); 
    } 

    public int getRadius() { 
     return radius; 
    } 

    @Override 
    public Insets getInsets() { 
     int value = getRadius()/2; 
     return new Insets(value, value, value, value); 
    } 

} 

一种解决方案是设置bordernull对于JScrollPane

+0

我做了'setBorder'为null并覆盖方法'getInsets',但没有任何改变。有没有其他方法可以删除'JScrollPane'? –

+1

您不想删除'JScrollPane',将'JScrollPane'的'border'设置为'null'“应该”删除它。您可能还需要使JScrollPane的JViewport透明以及JScrollPane本身透明 – MadProgrammer