2012-07-04 3 views
3

3D의 종류이기 때문에 베벨 테두리를 사용하고 싶지만 둥근 모서리의 베벨 보더를 만드는 방법을 모르겠습니다.Java Swing에서 둥근 모서리 BevelBorder를 만드는 방법은 무엇입니까?

둥근 반지름이 너무 작기 때문에 SoftBevelBorder가 작동하지 않습니다. 모서리를 더 둥글게 만드는 방법은 무엇입니까?

+1

가능한 [배경 이미지가있는 JTextArea의 내부 패딩] (0120)을 (를) 참조하십시오. – trashgod

답변

2

다음은 반경을 조정할 수 있습니다 둥근 테두리의 예제가있다 :

http://java-swing-tips.blogspot.co.at/2012/03/rounded-border-for-jtextfield.html

베벨하지 않습니다,하지만 당신은 SoftBevelBorder의 소스 코드에서 "bevelness"를 달성하는 방법을 볼 수 있습니다. 당신이 그것을 할 수 있다면, 나는 코드에 흥미가있을 것이다 :

+0

몇 년 후 알고 있습니다. 그러나 당신의 관심사가 여전히 나의 대답 – Dan

1

올바른 테두리 모양을 얻으려면 AbstractBorder.paintBorder(...) 메서드를 재정의해야한다. 그렇게하면 메소드와 비슷한 코드를 메소드에 추가 할 수 있습니다.

super.paintBorder(c, g, x, y, width, height); 

Graphics2D g2d = (Graphics2D) g; 
g2d.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)); 

Shape clip = g2d.getClip(); 
Area rect = new Area(clip); 
rect.subtract(new Area(new RoundRectangle2D.Double(x, y, width, height, radii, radii))); 
g2d.setClip(rect); 
g2d.setColor(c.getParent().getBackground()); 
g2d.fillRect(0, 0, width, height); 
g2d.setClip(clip); 
g2d.draw(rect); 

이제 두 가지 방법을 사용하여 테두리 주위에 경사 효과를 그릴 수 있지만, 베벨이 원하는 복잡성에 따라하는 것은 당신이 사용하는 방식에 따라 할 수있다. 2 개의 색상을 사용하는 간단한 경사 경계의 경우 이와 비슷한 것을 사용할 수 있습니다. 당신은 4 개 가지 색상을 사용하는 더 복잡한 사영 보더를 사용하려면

g2d.setColor(inner); //Inner Rectangle 
g2d.draw(new RoundRectangle2D.Double(x + 1, y + 1, width - 2, height - 2, radii, radii)); 

g2d.setColor(outer); //Outer Rectangle 
g2d.draw(new RoundRectangle2D.Double(x, y, width - 2, height - 2, radii, radii)); 

그러나, 당신은 javax.swing.border.BevelBorder의 소스 코드를 볼 필요가있을 것이다. 이렇게하면 비슷한 코드가 필요하다는 것을 알 수 있습니다.

double offset = radii/2; 
//Outer 
g2d.setColor(outerH); 
g2d.draw(new Line2D.Double(0, offset, 0, height - 2 - offset)); //Left 
g2d.draw(new Line2D.Double(1 + offset, 0, width - 2 - offset, 0)); //Top 
g2d.draw(new Arc2D.Double(width - radii - 1, 0, radii, radii, 0, 90, Arc2D.OPEN)); //Top Right 
g2d.draw(new Arc2D.Double(0, 0, radii, radii, 90, 90, Arc2D.OPEN)); //Top Left 

//Inner 
g2d.setColor(innerH); 
g2d.draw(new Line2D.Double(1, 1 + offset, 1, height - 3 - offset)); //Left 
g2d.draw(new Line2D.Double(2 + offset, 1, width - 3 - offset, 1)); //Top 
g2d.draw(new Arc2D.Double(width - radii - 2, 1, radii, radii, 0, 90, Arc2D.OPEN)); //Top Right 
g2d.draw(new Arc2D.Double(1, 1, radii, radii, 90, 90, Arc2D.OPEN)); //Top Left 

//Outer 
g2d.setColor(outer); 
g2d.draw(new Line2D.Double(offset, height - 1, width - 1 - offset, height - 1)); //Bottom 
g2d.draw(new Line2D.Double(width - 1, offset, width - 1, height - 2 - offset)); //Right 
g2d.draw(new Arc2D.Double(width - radii - 1, height - radii - 1, radii, radii, 270, 90, Arc2D.OPEN)); //Bottom Right 
g2d.draw(new Arc2D.Double(0, height - radii - 1, radii, radii, 180, 90, Arc2D.OPEN)); //Bottom Left 

//Inner 
g2d.setColor(inner); 
g2d.draw(new Line2D.Double(1 + offset, height - 2, width - 2 - offset, height - 2)); //Bottom 
g2d.draw(new Line2D.Double(width - 2, 1 + offset, width - 2, height - 3 - offset)); //Right 
g2d.draw(new Arc2D.Double(width - radii - 2, height - radii - 2, radii, radii, 270, 90, Arc2D.OPEN)); //Bottom Right 
g2d.draw(new Arc2D.Double(1, height - radii - 2, radii, radii, 180, 90, Arc2D.OPEN)); //Bottom Left 

색상이 모퉁이를 돌면 중간에 멈추는 것이 중요 할 경우 다음 코드를 사용할 수도 있습니다.

double offset = radii/2; 
//Outer 
g2d.setColor(outerH); 
g2d.draw(new Line2D.Double(0, offset, 0, height - 2 - offset)); //Left 
g2d.draw(new Line2D.Double(1 + offset, 0, width - 2 - offset, 0)); //Top 
g2d.draw(new Arc2D.Double(width - radii - 1, 0, radii, radii, 45, 45, Arc2D.OPEN)); //Top Right P1 
g2d.draw(new Arc2D.Double(0, 0, radii, radii, 90, 90, Arc2D.OPEN)); //Top Left 
g2d.draw(new Arc2D.Double(0, height - radii - 1, radii, radii, 180, 45, Arc2D.OPEN)); //Bottom Left P1 

//Inner 
g2d.setColor(innerH); 
g2d.draw(new Line2D.Double(1, 1 + offset, 1, height - 3 - offset)); //Left 
g2d.draw(new Line2D.Double(2 + offset, 1, width - 3 - offset, 1)); //Top 
g2d.draw(new Arc2D.Double(width - radii - 2, 1, radii, radii, 45, 45, Arc2D.OPEN)); //Top Right P1 
g2d.draw(new Arc2D.Double(1, 1, radii, radii, 90, 90, Arc2D.OPEN)); //Top Left 
g2d.draw(new Arc2D.Double(1, height - radii - 2, radii, radii, 180, 45, Arc2D.OPEN)); //Bottom Left P1 

//Outer 
g2d.setColor(outerS); 
g2d.draw(new Line2D.Double(offset, height - 1, width - 1 - offset, height - 1)); //Bottom 
g2d.draw(new Line2D.Double(width - 1, offset, width - 1, height - 2 - offset)); //Right 
g2d.draw(new Arc2D.Double(width - radii - 1, 0, radii, radii, 0, 45, Arc2D.OPEN)); //Top Right P2 
g2d.draw(new Arc2D.Double(width - radii - 1, height - radii - 1, radii, radii, 270, 90, Arc2D.OPEN)); //Bottom Right 
g2d.draw(new Arc2D.Double(0, height - radii - 1, radii, radii, 225, 45, Arc2D.OPEN)); //Bottom Left P2 

//Inner 
g2d.setColor(innerS); 
g2d.draw(new Line2D.Double(1 + offset, height - 2, width - 2 - offset, height - 2)); //Bottom 
g2d.draw(new Line2D.Double(width - 2, 1 + offset, width - 2, height - 3 - offset)); //Right 
g2d.draw(new Arc2D.Double(width - radii - 2, 1, radii, radii, 0, 45, Arc2D.OPEN)); //Top Right P2 
g2d.draw(new Arc2D.Double(width - radii - 2, height - radii - 2, radii, radii, 270, 90, Arc2D.OPEN)); //Bottom Right 
g2d.draw(new Arc2D.Double(1, height - radii - 2, radii, radii, 225, 45, Arc2D.OPEN)); //Bottom Left P2 

이 모든 것을 종합하면 다음과 같은 클래스가 생성됩니다.

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Insets; 
import java.awt.RenderingHints; 
import java.awt.Shape; 
import java.awt.geom.Arc2D; 
import java.awt.geom.Area; 
import java.awt.geom.Line2D; 
import java.awt.geom.RoundRectangle2D; 

import javax.swing.border.AbstractBorder; 

@SuppressWarnings("serial") 
public class RoundedBorder extends AbstractBorder { 
    private int radii; 
    private Insets insets; 
    private Color innerS = new Color(166, 166, 166); 
    private Color outerS = new Color(116, 116, 116); 
    private Color innerH = Color.WHITE; 
    private Color outerH = Color.WHITE; 
    private boolean tColor = false; 

    public RoundedBorder(int radius) { 
     radii = radius; 
    } 

    public RoundedBorder(int radius, Insets i) { 
     radii = radius; 
     insets = i; 
    } 

    public RoundedBorder(int radius, Insets i, Color out, Color in) { 
     radii = radius; 
     insets = i; 
     innerS = in; 
     outerS = out; 
     tColor = true; 
    } 

    public RoundedBorder(int radius, Insets i, Color outH, Color inH, Color outS, Color inS) { 
     radii = radius; 
     insets = i; 
     innerS = inS; 
     outerS = outS; 
     innerH = inH; 
     outerH = outH; 
    } 

    @Override 
    public Insets getBorderInsets(Component c) { 
     if(insets != null) { 
      return insets; 
     } 
     return new Insets(5, 5, 5, 5); 
    } 

    @Override 
    public Insets getBorderInsets(Component c, Insets insets) { 
     return getBorderInsets(c); 
    } 

    @Override 
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { 
     super.paintBorder(c, g, x, y, width, height); 

     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)); 

     Shape clip = g2d.getClip(); 
     Area rect = new Area(clip); 
     rect.subtract(new Area(new RoundRectangle2D.Double(x, y, width, height, radii, radii))); 
     g2d.setClip(rect); 
     g2d.setColor(c.getParent().getBackground()); 
     g2d.fillRect(0, 0, width, height); 
     g2d.setClip(clip); 
     g2d.draw(rect); 

     if(!tColor) { 
      double offset = radii/2; 
      //Outer 
      g2d.setColor(outerH); 
      g2d.draw(new Line2D.Double(0, offset, 0, height - 2 - offset)); //Left 
      g2d.draw(new Line2D.Double(1 + offset, 0, width - 2 - offset, 0)); //Top 
      g2d.draw(new Arc2D.Double(width - radii - 1, 0, radii, radii, 45, 45, Arc2D.OPEN)); //Top Right P1 
      g2d.draw(new Arc2D.Double(0, 0, radii, radii, 90, 90, Arc2D.OPEN)); //Top Left 
      g2d.draw(new Arc2D.Double(0, height - radii - 1, radii, radii, 180, 45, Arc2D.OPEN)); //Bottom Left P1 

      //Inner 
      g2d.setColor(innerH); 
      g2d.draw(new Line2D.Double(1, 1 + offset, 1, height - 3 - offset)); //Left 
      g2d.draw(new Line2D.Double(2 + offset, 1, width - 3 - offset, 1)); //Top 
      g2d.draw(new Arc2D.Double(width - radii - 2, 1, radii, radii, 45, 45, Arc2D.OPEN)); //Top Right P1 
      g2d.draw(new Arc2D.Double(1, 1, radii, radii, 90, 90, Arc2D.OPEN)); //Top Left 
      g2d.draw(new Arc2D.Double(1, height - radii - 2, radii, radii, 180, 45, Arc2D.OPEN)); //Bottom Left P1 

      //Outer 
      g2d.setColor(outerS); 
      g2d.draw(new Line2D.Double(offset, height - 1, width - 1 - offset, height - 1)); //Bottom 
      g2d.draw(new Line2D.Double(width - 1, offset, width - 1, height - 2 - offset)); //Right 
      g2d.draw(new Arc2D.Double(width - radii - 1, 0, radii, radii, 0, 45, Arc2D.OPEN)); //Top Right P2 
      g2d.draw(new Arc2D.Double(width - radii - 1, height - radii - 1, radii, radii, 270, 90, Arc2D.OPEN)); //Bottom Right 
      g2d.draw(new Arc2D.Double(0, height - radii - 1, radii, radii, 225, 45, Arc2D.OPEN)); //Bottom Left P2 

      //Inner 
      g2d.setColor(innerS); 
      g2d.draw(new Line2D.Double(1 + offset, height - 2, width - 2 - offset, height - 2)); //Bottom 
      g2d.draw(new Line2D.Double(width - 2, 1 + offset, width - 2, height - 3 - offset)); //Right 
      g2d.draw(new Arc2D.Double(width - radii - 2, 1, radii, radii, 0, 45, Arc2D.OPEN)); //Top Right P2 
      g2d.draw(new Arc2D.Double(width - radii - 2, height - radii - 2, radii, radii, 270, 90, Arc2D.OPEN)); //Bottom Right 
      g2d.draw(new Arc2D.Double(1, height - radii - 2, radii, radii, 225, 45, Arc2D.OPEN)); //Bottom Left P2 
     } else { 
      g2d.setColor(innerS); //Inner Rectangle 
      g2d.draw(new RoundRectangle2D.Double(x + 1, y + 1, width - 2, height - 2, radii, radii)); 

      g2d.setColor(outerS); //Outer Rectangle 
      g2d.draw(new RoundRectangle2D.Double(x, y, width - 2, height - 2, radii, radii)); 
     } 
    } 
} 

지금 당신은 yourComponent.setBorder(new RoundedBorder(10));를 수행하여 또는 RoundedBorder 클래스의 다른 생성자 중 하나를 사용하여 구성 요소에이 클래스를 구현할 수 있습니다.

+1

을 보았다면 나는 그것을 시험해 보았고, 둥글게 보였지만 경 사진 적이지 않았다. 적어도 BevelBorder와 비슷한 방식으로는 아니었다. – lbalazscs

+0

@lbalazscs 피드백을 보내 주셔서 감사합니다. 게시하기 전에 초기 경사 경계 색으로 시도해야합니다. 나는 당신이'yourComponent.setBorder (new RoundedBorder (10)) '을 사용할 때 코드를 편집하여 기본적으로 "bevelly"(단어가 아닌 : P)가 더 많이 보일 것입니다. – Dan

+0

@lbalazscs 외모가 더 좋아 보이거나 어떻게 든 변경해야합니까? – Dan