Java Swing에서 끌어서 크기를 조정할 수있는 구성 요소를 만드는 방법은 무엇입니까?Java에서 드래그 가능하고 크기를 조정할 수있는 구성 요소 만들기
이미지의 빨간색 테두리로 강조 표시된 MS 그림판의 "텍스트 도구"텍스트 상자 기능과 비슷합니다.
텍스트 서식이 아닌 드래그 앤 크기 조정 기능 만 필요합니다.
Java Swing을 사용하여이 구성 요소를 구현하려면 어떻게해야합니까?
Java Swing에서 끌어서 크기를 조정할 수있는 구성 요소를 만드는 방법은 무엇입니까?Java에서 드래그 가능하고 크기를 조정할 수있는 구성 요소 만들기
이미지의 빨간색 테두리로 강조 표시된 MS 그림판의 "텍스트 도구"텍스트 상자 기능과 비슷합니다.
텍스트 서식이 아닌 드래그 앤 크기 조정 기능 만 필요합니다.
Java Swing을 사용하여이 구성 요소를 구현하려면 어떻게해야합니까?
스스로 할 어렵지 않을 것이다. 마우스 수신기 및 마우스 동작 수신기를 구성 요소에 추가하기 만하면됩니다. 변수 만들기 int lastMouseX, lastMouseY, mode; 부울 mousePressed뿐 아니라 mouseMoved 및 mouseDragged 이벤트에서 lastMouseX 및 lastMouseY를 설정합니다. 마우스 수신기의 마우스 수신기에서 마우스 위치에 따라 수행해야 할 작업 (즉, 크기 조정 또는 이동)을 확인합니다. 모드를 모드로 설정하십시오 (드래그하는 경우 1, 크기 조정하는 경우 2). 그 후 mouseDragged의 마우스 모션 리스너에서 마지막 마우스 위치에서 마우스의 변위를 계산하고 이에 따라 작업을 수행합니다. 제 설명을하고 나서 애써 주시면 몇 가지 코드를 게시하겠습니다.
드래그 기능은 크기 조정 기능만큼 큰 문제는 아닙니다. 리사이즈 앵커의 경우 구성 요소의 크기를 추적 할 수있는 마우스 리스너가있는 작은 패널을 사용해야합니다. – Akshat
하지 마십시오. 모든 구성 요소를 하나의 구성 요소로 만듭니다. 앵커를 표시하려면 paintComponent 메소드에 앵커를 그립니다. 마우스 앵커를 잡는 한, 마우스가 mousePressed 이벤트의 사각형에 있는지 확인하기 만하면 상단 왼쪽 앵커에 대해 다음과 같이 보일 것입니다 : if (new Rectangle (component.getX(), component.getY(), anchorize) .contains (new Point (mouseEvent.getX(), mouseEvent.getY))) {mode = RESIZE; }'(IDE에서 오류를 검사하지는 않았지만 아이디어를 얻었습니다.) –
예, 알겠습니다. 나는 그것을 시도 할 것이다, 고마워. – Akshat
이 문제를 해결하기 위해 나는 Piccolo2d ZUI 라이브러리를 발견했습니다.
그게 바로 내가 찾고있는 것입니다! 그러나 "Draggable & 크기 조정이 가능한 텍스트 상자"을 구현하는 것이 가장 좋은 방법 일 수는 없지만 Piccolo2d를 사용하여 한 시간 이내에 작업 할 수 있습니다. 누군가가 유용하다고 생각한다면 여기에 코드를 게시하고 있습니다.
다음은 샘플 애플리케이션의 스크린 샷입니다.
가능한 코드를 작성하려고 했으므로 약간 길어졌습니다.
이 코드를 실행하려면 piccolo2d-core-XXX.jar
& piccolo2d-extras-XXX.jar
이 필요하며 Maven Central Repository에서 다운로드 할 수 있습니다. 3.0 버전을 사용했습니다 & 다른 버전에서는 테스트하지 않았습니다!
class PBox extends PNode {
private PCanvas canvas;
private Rectangle2D rectangle;
private Cursor moveCursor;
public PBox(PCanvas canvas) {
this(0, 0, 50, 50, canvas);
}
public PBox(double x, double y, double width, double height, PCanvas canvas) {
this.canvas = canvas;
rectangle = new Rectangle2D.Double();
moveCursor = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);
addAnchors(x, y, width, height);
setBounds(x, y, width, height);
setInputEventListener();
}
private void addAnchors(double x, double y, double width, double height) {
addChild(new Anchor(SwingConstants.NORTH));
addChild(new Anchor(SwingConstants.NORTH_EAST));
addChild(new Anchor(SwingConstants.EAST));
addChild(new Anchor(SwingConstants.SOUTH_EAST));
addChild(new Anchor(SwingConstants.SOUTH));
addChild(new Anchor(SwingConstants.SOUTH_WEST));
addChild(new Anchor(SwingConstants.WEST));
addChild(new Anchor(SwingConstants.NORTH_WEST));
}
private void setInputEventListener() {
addInputEventListener(new PBasicInputEventHandler() {
@Override
public void mouseEntered(PInputEvent event) {
canvas.setCursor(moveCursor);
}
@Override
public void mouseExited(PInputEvent event) {
canvas.setCursor(Cursor.getDefaultCursor());
}
@Override
public void mouseDragged(PInputEvent event) {
PDimension delta = event.getDeltaRelativeTo(PBox.this);
translate(delta.width, delta.height);
event.setHandled(true);
}
});
}
@Override
protected void layoutChildren() {
Iterator iterator = getChildrenIterator();
int position = SwingConstants.NORTH;
while (iterator.hasNext()) {
PNode anchor = (PNode) iterator.next();
anchor.setBounds(getAnchorBounds(position));
++position;
}
}
private Rectangle2D getAnchorBounds(int position) {
double x = 0, y = 0;
Rectangle2D b = getBounds();
switch (position) {
case SwingConstants.NORTH:
x = b.getX()+b.getWidth()/2;
y = b.getY();
break;
case SwingConstants.NORTH_EAST:
x = b.getX()+b.getWidth();
y = b.getY();
break;
case SwingConstants.EAST:
x = b.getX()+b.getWidth();
y = b.getY()+b.getHeight()/2;
break;
case SwingConstants.SOUTH_EAST:
x = b.getX()+b.getWidth();
y = b.getY()+b.getHeight();
break;
case SwingConstants.SOUTH:
x = b.getX()+b.getWidth()/2;
y = b.getY()+b.getHeight();
break;
case SwingConstants.SOUTH_WEST:
x = b.getX();
y = b.getY()+b.getHeight();
break;
case SwingConstants.WEST:
x = b.getX();
y = b.getY()+b.getHeight()/2;
break;
case SwingConstants.NORTH_WEST:
x = b.getX();
y = b.getY();
break;
}
return new Rectangle2D.Double(x-2, y-2, 4, 4);
}
@Override
public boolean setBounds(double x, double y, double width, double height) {
if (super.setBounds(x, y, width, height)) {
rectangle.setFrame(x, y, width, height);
return true;
}
return false;
}
@Override
public boolean intersects(Rectangle2D localBounds) {
return rectangle.intersects(localBounds);
}
@Override
protected void paint(PPaintContext paintContext) {
Graphics2D g2 = paintContext.getGraphics();
g2.setPaint(Color.BLACK);
g2.setStroke(new BasicStroke(1.0f,
BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER,
1.0f, new float[]{4.0f}, 0));
g2.draw(rectangle);
}
class Anchor extends PNode {
private Rectangle2D point;
private Cursor resizeCursor;
Anchor(int position) {
point = new Rectangle2D.Double();
setCursor(position);
setInputEventListener(position);
}
private void setCursor(int position) {
switch (position) {
case SwingConstants.NORTH:
resizeCursor = Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR);
break;
case SwingConstants.NORTH_EAST:
resizeCursor = Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR);
break;
case SwingConstants.EAST:
resizeCursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
break;
case SwingConstants.SOUTH_EAST:
resizeCursor = Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR);
break;
case SwingConstants.SOUTH:
resizeCursor = Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR);
break;
case SwingConstants.SOUTH_WEST:
resizeCursor = Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR);
break;
case SwingConstants.WEST:
resizeCursor = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);
break;
case SwingConstants.NORTH_WEST:
resizeCursor = Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR);
break;
default:
resizeCursor = Cursor.getDefaultCursor();
}
}
private void setInputEventListener(final int position) {
addInputEventListener(new PBasicInputEventHandler() {
@Override
public void mouseEntered(PInputEvent event) {
canvas.setCursor(resizeCursor);
event.setHandled(true);
}
@Override
public void mouseExited(PInputEvent event) {
canvas.setCursor(Cursor.getDefaultCursor());
event.setHandled(true);
}
@Override
public void mouseDragged(PInputEvent event) {
PDimension delta = event.getDeltaRelativeTo(Anchor.this);
PNode parent = getParent();
if (position == SwingConstants.EAST
|| position == SwingConstants.NORTH_EAST
|| position == SwingConstants.SOUTH_EAST) {
parent.setWidth(parent.getWidth() + delta.width);
} else if (position == SwingConstants.WEST
|| position == SwingConstants.NORTH_WEST
|| position == SwingConstants.SOUTH_WEST) {
parent.setX(parent.getX() + delta.width);
parent.setWidth(parent.getWidth() - delta.width);
}
if (position == SwingConstants.SOUTH
|| position == SwingConstants.SOUTH_EAST
|| position == SwingConstants.SOUTH_WEST) {
parent.setHeight(parent.getHeight() + delta.height);
} else if (position == SwingConstants.NORTH
|| position == SwingConstants.NORTH_EAST
|| position == SwingConstants.NORTH_WEST) {
parent.setY(parent.getY() + delta.height);
parent.setHeight(parent.getHeight() - delta.height);
}
event.setHandled(true);
}
});
}
@Override
public boolean setBounds(double x, double y, double width, double height) {
if (super.setBounds(x, y, width, height)) {
point.setFrame(x, y, width, height);
return true;
}
return false;
}
@Override
public boolean intersects(Rectangle2D localBounds) {
return point.intersects(localBounds);
}
@Override
protected void paint(PPaintContext paintContext) {
Graphics2D g2 = paintContext.getGraphics();
g2.setColor(Color.WHITE);
g2.fill(point);
g2.setStroke(new BasicStroke(1.0f));
g2.setColor(Color.BLACK);
g2.draw(point);
}
}
}
그리고, 메인 클래스 다른 사람이 downvotes 당신에게 피드백을 제공하지 않았기 때문에
public class Piccolo2DExample extends PFrame {
@Override
public void initialize() {
PCanvas canvas = getCanvas();
PNode text = new PText("Draggable & Resizable Box using Piccolo2d");
text.scale(2.0);
canvas.getCamera().addChild(text);
PLayer layer = canvas.getLayer();
PNode aLayerNode = new PText("A_Layer_Node");
aLayerNode.setOffset(10, 50);
layer.addChild(aLayerNode);
// Adding the component to layer
layer.addChild(new PBox(50, 100, 250, 50, canvas));
}
public static void main(String[] args) {
PFrame frame = new Piccolo2DExample();
frame.setSize(800, 640);
}
}
"제안"질문은 눈살을 찌푸리게한다. 구체적인 문제가 필요합니다. – avgvstvs
구체적인 문제가 있습니다. 이미 웹을 검색했는데 이와 같은 구성 요소를 찾을 수 없었습니다. – Akshat
가능성이 높습니다. 직접 해결해야합니다. 적어도 표준 스윙은 이것을 할 수 없습니다. 어쩌면 외부의 사서 일 수도 있겠 니? – cello