2011-08-22 3 views
4

JPanel의 문장을 GridLayout(1,0) [예 : 한 줄/행]으로 표시 한 다음 구문 트리를 그리거나 그 위에 표시 할 수있게하려면 문장은 각각 하나의 단어를 포함하는 String의 행으로 나타납니다.JComponent에 1 행의 String를 표시해, 단일의 String를 선택 가능/그 위치 getLocation() - 가능합니까?

단일 String들 다음 중 하나 (A JList에서와 같이) 선택을해야한다, 아니면 적어도 getLocation()를 통해 JPanel에 자신의 위치를 ​​얻을 수 있어야합니다.

은 지금까지 나는 다음과 같은 옵션을 시도하고, 다음과 같은 문제가 있었다 : - JLabel의 같은 단일 String들 다음 JLabel의이 JPanel 폭, 단일 맞게 그들을 다시 크기 채우기 위해 뻗어있다 String 표시가 복잡해 보입니다. 그러나 문장을 처럼 보이게 만들려면이 작업을 수행하고 싶을 것입니다.은 문장과 비슷하지만 잘못 레이아웃 된 테이블을 좋아하지 않아야합니다. - JList : 원하는 모든 기능이 있지만 하나의 String (위의 JLabel 참조)의 "셀"크기를 다시 조정할 수있는 옵션을 알지 못합니다. 또한 JList의 표시를 단일 행/행으로 제한하는 데 어려움을 겪고 있습니다 (cf. another of my questions 참조). - JTextArea : 에 추가 한 String 단일 위치를 얻는 방법에 대해 머리를 돌릴 수 없었습니다.

이 옵션이 될 수 있지만 AWT와 스윙을 섞어서 사용하고 싶지 않기 때문에 사용하는 것이 좋습니다. 또한 모든 String에 대해 xy에 대한 int 값을 계산해야합니다. 그리고 비록 내가 어쨌든 그들을 계산해야하기 때문에 (물론 내가 그들의 int을지도 나 벡터에 저장할 수는 있겠지만) 나는 그들의 위치를 ​​전혀 얻을 수 있을지 확신 할 수 없다.

고맙습니다. 에 대한 모든 답변은입니다. 감사!

답변

3

modelToView()/viewToModel()을 사용하면 문자열의 위치에 대해 x, y를 얻고 좌표 x 및 y에 대한 문자열의 위치를 ​​얻습니다.

또한 Utilities 클래스 getWordStart() getWordEnd() getRowStart() getRowEnd() 방법을 사용하십시오.

+0

+1 내가 잘못 생각하지 않으면 라인 수가 늘어남에 따라 확장 성이 좋아질 것입니다. – trashgod

1

편집 : 코멘트에 camickr에서 언급 한 바와 같이, setSize()이 자동으로 각각의 LayoutManager에 의해 수행 될 때, 나는 내 대답에서 각각의 코드를 제거한 (구성 요소를 배치 할 수있는 적절한 방법이 아니다

트리거. StanislavL's answer에 의해, 차라리 한 (StanislavL에 의해 제안)에 비해 각각 String에 대한 하나를 사용하여이기는하지만, JTextField을 통해 그것을 할 수있는 솔루션을 발견했다.

내가 할 수있는 정말, 지금은 쉽게 각 JTextField에 대한 getLocation(). 간단한!

StanislavL에게 감사의 말을 전하고 싶습니다. 그의 답변에 대해서는, 그리고 그의 코멘트에 대해서는 Camickr에 대해 결코 알지 못합니다.

+0

-1, 레이아웃 관리자를 사용하지 않는 이유는 무엇입니까?기본 FlowLayout을 사용하면 구성 요소가 제대로 정렬됩니다. – camickr

+0

미안하지만 -1은 부적절하다고 생각합니다. 일반적으로 JPanel을 사용할 때마다 LayoutManager를 사용하고 있습니다 (내 편집 참조). 그리고 물론 구성 요소가 연속으로 정렬됩니다. 이는 내가 수행 한 작업이 아니 었습니다. 사실, 저는 FlowLayout을 사용하고 있습니다. 내가 원했던 것은 각각의 "String"(StanislavL과 JTextFields 모두에서 "구성 요소 화"됨)에 대해 getLocation()을 통해 위치를 가져올 수 있거나 단일 * 단어 *를 선택 가능하게 만들 수있게하는 것이 었습니다. StanislavL이 분명히 좋았고, 내게만 방아쇠를 당겼음에도 불구하고,이 솔루션은 * me *에 더 적합했습니다. 그러므로 나는 그것이 -1이 아니라고 생각합니다. –

+0

죄송합니다, 귀하의 코드는 setSize()를 사용하고 있으며 null 레이아웃을 사용하는 곳에서 내가 의미하는 것으로 해석 한 레이아웃 관리자를 지정하지 않았기 때문에 게시가 투표에 실패했습니다. 그러나 FlowLayout 인 기본 레이아웃 관리자를 사용하는 경우 FlowLayout이 텍스트 필드의 기본 크기를 따르므로 setSize()가 필요하지 않습니다. 구성 요소의 크기를 설정하는 것은 모든 레이아웃 관리자의 작업입니다. 절대로 setSize() 메서드를 호출하면 안됩니다. 예제에서 setSize() 코드를 제거하면 아래쪽 투표가 제거됩니다. – camickr

관련 문제