Hello StackOverflow 사용자!Java GUI 동적 객체 위치 재 지정
나는 문제가 나는 문제에 솔루션을 발견했다,하지만 난 솔루션 최적의 아니라고 생각합니다. 내가하고 싶은 것을 성취하기 위해 무차별 한 힘을 쓰고 싶다. 내가 원하는 것을 성취 할 수있는 더 좋은 방법이 있을지 궁금하다.
기본적으로 GridBagLayout을 사용하는 Java GUI 응용 프로그램이 있습니다. 레이아웃은 본질적으로 항상 가운데 맞춤이기 때문에 GridBagLayout을 사용합니다. 다른 것을 추가하면, 새로운 오브젝트가 추가 된 위치에 따라 위, 아래, 왼쪽 또는 오른쪽으로 모든 것이 이동합니다. 문제는 내 프로그램이 특정 객체를 제거해야한다는 것입니다 (다른 코드 블록에서 어떤 일이 발생하는지에 따라 다름). 그래서이 [1] [2] [3] [4]
처럼 줄 지어 4 개의 객체가 있고 [3]
을 제거하고 싶다고합시다. 본질적으로 레이아웃을 [1] [2] [3]
으로 변경하여 실질적으로 [3]
이후의 모든 것을 이동 시키길 원합니다. GridBagLayout의 작동 방식 때문에 시각적으로 문제가 발생하지 않았습니다. 그러나, 디스플레이에 새로운 것이 추가 될 때, 이 [3]
의 시각적 위치를 취 했음에도 불구하고 GridBagPosition (다른 무엇을 호출해야할지 확실하지 않음)이 변경되지 않았기 때문에 겹치는 부분이있을 것입니다. 그래서 나는 제거 과정을 위해 아래 코드를 구현했다.
public void removeSubImagePanel (int subPanelIdx) {
int x, y, nextX, nextY;
this.remove(this.portraits[subPanelIdx]);
nextX = this.portraits[subPanelIdx].getGbx();
nextY = this.portraits[subPanelIdx].getGby();
for (int i = subPanelIdx; i < this.numberOfPortraits; i++) {
x = nextX;
y = nextY;
this.portraits[i] = this.portraits[i+1];
if (this.portraits[i+1] != null) {
nextX = this.portraits[i+1].getGbx();
nextY = this.portraits[i+1].getGby();
this.portraits[i].getObject().setSubPanelIdx(i);
gbc.gridx = x;
gbc.gridy = y;
this.portraits[i].setGbLocation(x, y);
gb.setConstraints(this.portraits[i], gbc);
}
}
this.portraits[this.numberOfPortraits] = null;
this.numberOfPortraits--;
}
본질적 I는 GridBagLayout에의 X 및 Y의 위치를 유지하기 위해 "인물"개체 두 정수 변수를 추가했다. 그런 식으로, 나는 [3]
위치를 얻을 수 [4]
의 위치를 얻고 [3]
의 위치가 [5]
인 경우 [5]
의 위치를 [4]
의 이전 위치로 설정하면됩니다.
정수를 추가 할 필요가있는 "무차별 대단한 힘"이 느껴지고, 각 개체에 대해 개별 GridBagConstraint를 작성하는 것이 더 나쁠 것 같아요. 더 좋은 방법이 있습니까?
죄송합니다.이 질문은 매우 길다. 너무 오래 걸릴 것이라고 생각하지 않았습니다.이 질문이 여전히 괜찮기를 바랍니다. 내가 명확하지 않고 명확한 설명이 필요한 경우, 제발 주저하지 말고 물어보십시오!
편집 : CodeReview stackexchange에 있었다면 더 좋을까요? 그것은 실제로 그것을 가지고 더 의미가있는 것 같다. 나는 확실히 확신하지 않는다.
안녕하세요! 이 예제를 살펴 보았고, 내가 물어 본 것의 일반적인 범위 (예 : 내 제목이 무엇인지에 대해 특히 그렇습니다!)에 어떻게 적용될 수 있는지 봅니다. 하지만 내가하고 싶은 것은 _ 명령을 지키고 한 가지만 제거하는 것입니다. 예를 들어'[1] [2] [3]'과'[1]'을 제거하고 싶습니다. 나는 [2]와 [3]을 '[1]과 [2]'(시각적 위치뿐만 아니라'gbc '의 숫자도)로 바꾸기를 원한다. 예전의'[1]'백, 그것은 실제로 새로운'[3]'이 될 것이고 "list"의 끝에 붙이게 될 것입니다. – Sephallia
어쩌면 당신이 가지고있는 뭔가를 놓친 것일 수도 있습니다. 아마 그것이 당신이 그 링크를 보낸 이유 일 것입니다. 내가 잘못 이해하면 제게 말해줘! 나는 단지 그 링크가 나의 기술 된 상황에 어떻게 직접적으로 적용되는지 보는 데 어려움을 겪고있다. 비록 내가이 링크가이 질문에 어떻게 더 일반적인 의미로 적용되는지 명확히 볼 수는 있겠지만! – Sephallia
'removeAll()','add()','validate()'와 같은'Container' 메쏘드는 어떤 구성 요소 나 레이아웃이 사용되는지 신경 쓰지 않습니다. 'removeAll()'과'add()''[2]'와'[3]'은 이전에'[1]'과'[2]'가 사용하고 있던 슬롯으로 들어갑니다. – trashgod