3D의 종류이기 때문에 베벨 테두리를 사용하고 싶지만 둥근 모서리의 베벨 보더를 만드는 방법을 모르겠습니다.Java Swing에서 둥근 모서리 BevelBorder를 만드는 방법은 무엇입니까?
둥근 반지름이 너무 작기 때문에 SoftBevelBorder가 작동하지 않습니다. 모서리를 더 둥글게 만드는 방법은 무엇입니까?
3D의 종류이기 때문에 베벨 테두리를 사용하고 싶지만 둥근 모서리의 베벨 보더를 만드는 방법을 모르겠습니다.Java Swing에서 둥근 모서리 BevelBorder를 만드는 방법은 무엇입니까?
둥근 반지름이 너무 작기 때문에 SoftBevelBorder가 작동하지 않습니다. 모서리를 더 둥글게 만드는 방법은 무엇입니까?
다음은 반경을 조정할 수 있습니다 둥근 테두리의 예제가있다 :
http://java-swing-tips.blogspot.co.at/2012/03/rounded-border-for-jtextfield.html
베벨하지 않습니다,하지만 당신은 SoftBevelBorder의 소스 코드에서 "bevelness"를 달성하는 방법을 볼 수 있습니다. 당신이 그것을 할 수 있다면, 나는 코드에 흥미가있을 것이다 :
몇 년 후 알고 있습니다. 그러나 당신의 관심사가 여전히 나의 대답 – Dan
올바른 테두리 모양을 얻으려면 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
클래스의 다른 생성자 중 하나를 사용하여 구성 요소에이 클래스를 구현할 수 있습니다.
을 보았다면 나는 그것을 시험해 보았고, 둥글게 보였지만 경 사진 적이지 않았다. 적어도 BevelBorder와 비슷한 방식으로는 아니었다. – lbalazscs
@lbalazscs 피드백을 보내 주셔서 감사합니다. 게시하기 전에 초기 경사 경계 색으로 시도해야합니다. 나는 당신이'yourComponent.setBorder (new RoundedBorder (10)) '을 사용할 때 코드를 편집하여 기본적으로 "bevelly"(단어가 아닌 : P)가 더 많이 보일 것입니다. – Dan
@lbalazscs 외모가 더 좋아 보이거나 어떻게 든 변경해야합니까? – Dan
가능한 [배경 이미지가있는 JTextArea의 내부 패딩] (0120)을 (를) 참조하십시오. – trashgod