2012-06-12 2 views
2

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에 있었다면 더 좋을까요? 그것은 실제로 그것을 가지고 더 의미가있는 것 같다. 나는 확실히 확신하지 않는다.

답변

2

example은 컨테이너에서 모든 구성 요소를 제거하고 각 구성 요소를 임의의 순서로 완전히 바꿀 수 있음을 보여줍니다. 구성 요소 자체는 변경되지 않으므로 둘러싸는 컨테이너는 무시할 수 있습니다. validate()까지 소요되는 시간.

+0

안녕하세요! 이 예제를 살펴 보았고, 내가 물어 본 것의 일반적인 범위 (예 : 내 제목이 무엇인지에 대해 특히 그렇습니다!)에 어떻게 적용될 수 있는지 봅니다. 하지만 내가하고 싶은 것은 _ 명령을 지키고 한 가지만 제거하는 것입니다. 예를 들어'[1] [2] [3]'과'[1]'을 제거하고 싶습니다. 나는 [2]와 [3]을 '[1]과 [2]'(시각적 위치뿐만 아니라'gbc '의 숫자도)로 바꾸기를 원한다. 예전의'[1]'백, 그것은 실제로 새로운'[3]'이 될 것이고 "list"의 끝에 붙이게 될 것입니다. – Sephallia

+0

어쩌면 당신이 가지고있는 뭔가를 놓친 것일 수도 있습니다. 아마 그것이 당신이 그 링크를 보낸 이유 일 것입니다. 내가 잘못 이해하면 제게 말해줘! 나는 단지 그 링크가 나의 기술 된 상황에 어떻게 직접적으로 적용되는지 보는 데 어려움을 겪고있다. 비록 내가이 링크가이 질문에 어떻게 더 일반적인 의미로 적용되는지 명확히 볼 수는 있겠지만! – Sephallia

+0

'removeAll()','add()','validate()'와 같은'Container' 메쏘드는 어떤 구성 요소 나 레이아웃이 사용되는지 신경 쓰지 않습니다. 'removeAll()'과'add()''[2]'와'[3]'은 이전에'[1]'과'[2]'가 사용하고 있던 슬롯으로 들어갑니다. – trashgod

2

내가 요구 사항이 프로젝트를 위해 무엇인지 모르겠지만,이 (가) Spring Layout 체크 아웃 것이다 - 당신이 같은 일을 지정할 수 있습니다 레이아웃이 :

the left of [1] should be 10 pixels from the left of the panel 
the right of [1] should be 10 pixels from the left of [2] 
etc. 

그것은 훨씬 더 쉽게 (IMO)는 구현하기 당신 같은 멋진 유체 레이아웃이 여기에 설명되어 있습니다.

편집 : 그냥 시도하고 토론에 추가 할 :

어쩌면 당신은 패널에서 확장하고 거기에 당신이 당신의 이미지 패널의 목록을 유지할 수 PortraitPanel라는 클래스를 가질 수있다.public 메서드를 사용할 수 있습니다 : add (int index); remove (int index);

add (2)를 호출하면 그 패널을 해당 인덱스의 목록에 추가 한 다음 index-1 및 index + 1에서 패널을 가져 와서 이들에 대한 제약 조건을 조정하는 루틴을 수행합니다. 새로 추가 된 패널의 양쪽에 배치합니다. 마찬가지로 제거를 위해 인덱스 -1을 가져 와서 인덱스 + 1 옆에 배치하고 색인에서 항목을 제거하도록 제약 조건을 설정할 수 있습니다. 다시 말해, SpringLayout을 사용하면 창 크기가 조정될 때 상황이 유동적으로 유지되도록 설정하기가 쉽습니다.

이것은 사용자가하려는 작업과 일치하기를 바랍니다.

+0

안녕하세요! 답변 해주셔서 감사합니다. Spring Layout을 간단히 살펴 봤는데 정말 재미있을 것 같습니다! 가능한 미래의 프로젝트에 대해서는이를 염두에 두겠습니다. 그러나이 특정 프로젝트에 적합하지 않다고 생각합니다. 나는 Spring Layout을 사용하면 사물을 복잡하게 만들 것이라고 믿는다. 내가 [1] [2] [3] [4]를 가지고 있고 [2]를 제거하고 싶다고 말하십시오. 그때 나는'[1]과 [3]을 둘 다 변경해야 할 것 같다. 또한 매 4마다 새로운 줄을 만든다. 그래서 [1] [6] 밑에 [5] [6] 2]'를 제거하고'[5]'를 제거하고 싶습니까? 그렇다면'[1] [2]와 [6]'을 바꿀 필요가 있습니다. (적어도 그것이 내 이해입니다.) – Sephallia