2015-12-22 138 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