다중 JFrame의 사용 : 좋은 습관인가 나쁜가? [닫은]
이미지를 표시하고 데이터베이스에서 사운드를 재생하는 응용 프로그램을 개발 중입니다. GUI에서 데이터베이스에 이미지를 추가하기 위해 별도의 JFrame을 사용할지 여부를 결정하려고합니다.
여러 JFrame 창을 사용하는 것이 좋은 방법인지 궁금합니다.
답변
여러 JFrame을 사용하는 것이 좋은 방법인지 궁금합니다.
나쁜 (나쁜, 나쁜) 연습.
- 사용자에게 비 친화적 : 사용자가 하나만 볼 것으로 예상 할 때 작업 표시 줄에 여러 아이콘이 표시됩니다. 게다가 코딩 문제의 부작용 ..
- 코딩 및 유지 관리의 악몽 :
- 모달 대화는 그 대화의 내용에 대한 이벤트 초점주의에 쉽게 기회를 - 선택 / 수정 /이를 취소 한 후 진행합니다. 여러 프레임은 그렇지 않습니다.
- 부모를 클릭하면 부모가있는 대화 상자 (또는 부동 도구 모음)가 맨 앞으로 표시됩니다. 원하는 동작 인 경우 프레임에서이를 구현해야합니다.
하나의 GUI에 여러 요소를 표시하는 방법에는 여러 가지가 있습니다. 예 :
- CardLayout(짧은 데모. ). 좋은:
- 대화 상자와 같은 마법사 표시.
- 관련 구성 요소가있는 항목에 대한 목록, 트리 등 선택을 표시합니다.
- 구성 요소 없음과 보이는 구성 요소 사이를 뒤집습니다.
- JInternalFrame/JDesktopPane 일반적으로 MDI에 사용됩니다 .
- JTabbedPane 구성 요소 그룹.
- JSplitPane 사용자가 수행하는 작업에 따라 중요도 (크기)가 다른 두 구성 요소를 표시하는 방법입니다.
- JLayeredPane 훨씬 많은 잘 .. 계층화 된 구성 요소.
- JToolBar일반적으로 작업 또는 컨트롤 그룹이 포함됩니다. 사용자의 필요에 따라 GUI에서 끌거나 완전히 끌 수 있습니다. 위에서 언급했듯이는 부모에 따라 최소화 / 복원합니다.
- JList(아래 간단한 예)의 항목으로 .
- A의 노드로 JTree.
- 중첩 된 레이아웃 .
그러나 이러한 전략이 특정 사용 사례에서 작동하지 않는 경우 다음을 시도하십시오. 단일 기본 JFrame
을 설정 한 다음 프레임을 대화 상자의 부모로 사용하여 나머지 자유 부동 요소에 대해 JDialog또는 JOptionPane인스턴스를 표시합니다.
많은 이미지
여러 요소가 이미지 인이 경우 다음 중 하나를 대신 사용하는 것이 좋습니다.
JLabel
사용자가 그 순간에 관심이있는 이미지를 표시 하는 단일 (스크롤 창 중앙). 에서 볼 수 있듯이 ImageViewer.
- 단일 행
JList
. 이 답변 에서 볼 수 있습니다. 그 '단일 행'부분은 모두 동일한 차원 인 경우에만 작동합니다. 또는 즉석에서 이미지의 크기를 조정할 준비가되어 있고 모두 동일한 종횡비 (예 : 4 : 3 또는 16 : 9) 인 경우입니다.
다중 JFrame
접근 방식은 스윙 앱을 프로그래밍하기 시작한 이후로 구현 한 것입니다. 대부분의 경우 처음에 더 잘 알지 못해서 해냈습니다. 그러나 개발자로서의 경험과 지식이 성숙하고 온라인에서 더 많은 경험이 풍부한 Java 개발자의 의견을 읽고 흡수하기 시작 하면서 여러 접근 방식 에서 벗어나 려고 시도했습니다 JFrame
(현재 프로젝트와 향후 프로젝트 모두에서). ) 만나기 위해서만 ... 이걸 ... 내 고객들의 저항을 받아라! 모달 대화 상자를 구현하여 "자식"창과 JInternalFrame
별도의 구성 요소 를 제어 하기 시작하자 클라이언트가 불평하기 시작했습니다! 나는 내가 최선이라고 생각하는 것을하고 있었기 때문에 매우 놀랐다! 그러나 그들이 말하는 것처럼 "행복한 아내는 행복한 삶입니다." 고객도 마찬가지입니다. 물론 저는 계약자이므로 최종 사용자는 개발자 인 저에게 직접 액세스 할 수 있습니다. 이는 분명히 일반적인 시나리오가 아닙니다.
그래서 저는 여러 JFrame
접근 방식 의 이점을 설명하고 다른 사람들이 제시 한 몇 가지 단점을 신화를 깨뜨릴 것입니다.
- 레이아웃의 궁극적 인 유연성 -별도
JFrame
의 s 를 허용함으로써 최종 사용자가 자신의 화면에있는 내용을 분산하고 제어 할 수있는 기능을 제공합니다. 개념은 "개방적"이고 비수 축적이라고 느낍니다. 당신은 하나의 큰JFrame
무리를 향해 갈 때 이것을 잃습니다JInternalFrame
. - 매우 모듈화 된 응용 프로그램에서 잘 작동합니다 . 제 경우에는 대부분의 응용 프로그램에 서로 전혀 관련이없는 3 ~ 5 개의 큰 "모듈"이 있습니다. 예를 들어, 하나의 모듈은 판매 대시 보드이고 다른 하나는 회계 대시 보드 일 수 있습니다. 그들은 서로 또는 아무것도 말하지 않습니다. 그러나 경영진은 둘 다 열고 싶을 수 있으며 작업 표시 줄에 별도의 프레임이 있으면 삶이 더 쉬워집니다.
- 최종 사용자가 외부 자료를 쉽게 참조 할 수 있도록합니다. 한 번은 다음과 같은 상황이있었습니다. 내 앱에는 "새로 추가"를 클릭 할 수있는 "데이터 뷰어"가 있고 데이터 입력 화면이 열립니다. 처음에는 둘 다
JFrame
s였습니다. 그러나 데이터 입력 화면JDialog
이 데이터 뷰어 인 부모가 되기를 원했습니다 . 변경 한 후 즉시 뷰어를 최소화하거나 닫을 수 있다는 사실에 크게 의존 하고 프로그램의 다른 부분 (또는 웹 사이트)을 참조하는 동안 편집기를 열어 둘 수 있다는 사실에 크게 의존하는 최종 사용자로부터 전화를 받았습니다. 기억하지 마십시오). 그는입니다 하지 그가 엔트리 먼저하는 대화 상자가 필요하므로, 다중 모니터에 뭔가 다른 데이터가 완전히 숨겨 뷰어, 둘째로. 이것은 a로 불가능JDialog
했고 확실히 불가능JInternalFrame
했을 것입니다. 나는 마지 못해JFrames
그의 정신 을 위해 분리되도록 다시 바꾸 었지만 중요한 교훈을 얻었습니다. - 오해 : 코딩하기 어렵다 -내 경험으로는 사실이 아니다. 를 만드는
JInternalFrame
것이JFrame
. 사실 내 경험상JInternalFrames
훨씬 적은 유연성을 제공합니다. 나는JFrame
정말 잘 작동하는 내 앱에서 s 의 열기 및 닫기를 처리하는 체계적인 방법을 개발했습니다 . 나는 프레임의 코드 자체에서 거의 완벽하게 프레임을 제어합니다. 새 프레임 생성,SwingWorker
백그라운드 스레드의 데이터 검색 및 EDT의 GUI 코드, 사용자가 두 번 열려고 할 경우 프레임 앞으로 가져 오기 등을 제어하는JFrame
s. 내 s 를 여는 데 필요한 모든 것은 공개 정적 메서드를 호출하고 이벤트open()
와 결합 된 open 메서드를 호출windowClosing()
하여 나머지를 처리합니다 (프레임이 이미 열려 있습니까? 열려 있지 않지만로드 중입니까? 등).이 접근 방식을 템플릿으로 만들었으므로 각 프레임에 대해 구현하기가 어렵지 않습니다. . - 통념 / 미 증명 : 리소스 헤비 -이 추측 성 진술 뒤에 숨겨진 몇 가지 사실을보고 싶습니다. 하지만, 아마도 당신은 말할 수
JFrame
(A)보다 요구에 더 많은 공간을JInternalFrame
100 열 개 경우에도JFrame
, 당신은 정말 얼마나 더 많은 자원을 소비하는 것들? 리소스로 인한 메모리 누수가 우려되는 경우 : 호출dispose()
은 가비지 수집을 위해 프레임에서 사용하는 모든 리소스를 해제합니다 (다시 말하지만 aJInternalFrame
는 정확히 동일한 문제를 호출해야합니다).
나는 많이 썼고 더 많이 쓸 수있을 것 같다. 여하튼, 단순히 인기가없는 의견이라 하향 표를받지 않았 으면합니다. 이 질문은 분명히 귀중한 질문이며 일반적인 의견이 아니더라도 귀중한 답변을 제공했기를 바랍니다.
다중 프레임 / 프레임 당 단일 문서 ( SDI ) 대 단일 프레임 / 프레임 당 다중 문서 ( MDI )의 좋은 예는 Microsoft Excel입니다. MDI 이점 중 일부 :
- 직사각형이 아닌 모양의 창을 몇 개 가질 수 있으므로 다른 프로세스 (예 : 웹 브라우저)에서 바탕 화면이나 다른 창을 숨기지 않습니다.
- 두 번째 Excel 창에서 쓰는 동안 한 Excel 창에서 다른 프로세스의 창을 열 수 있습니다. MDI를 사용하면 내부 창 중 하나에 쓰려고하면 전체 Excel 창에 초점이 맞춰 지므로 다른 프로세스에서 창을 숨 깁니다.
- 다른 화면에 다른 문서를 가질 수 있으며, 이는 화면의 해상도가 같지 않을 때 특히 유용합니다.
SDI (단일 문서 인터페이스, 즉 모든 창에 단일 문서 만있을 수 있음) :
MDI (다중 문서 인터페이스, 즉 모든 창에 여러 문서가있을 수 있음) :
방금 참여한 예제를 통해 "사용자 친화적이지 않은"주장에 반박하고 싶습니다.
응용 프로그램에는 사용자가 다양한 '프로그램'을 별도의 탭으로 실행하는 기본 창이 있습니다. 가능한 한 응용 프로그램을이 단일 창에 유지하려고 노력했습니다.
그들이 실행하는 '프로그램'중 하나는 시스템에 의해 생성 된 보고서 목록을 제공하며 사용자는 각 줄의 아이콘을 클릭하여 보고서 뷰어 대화 상자를 열 수 있습니다. 이 뷰어는 보고서의 세로 / 가로 A4 페이지에 해당하는 페이지를 표시하므로 사용자는이 창이 상당히 커서 화면을 거의 채우는 것을 좋아합니다.
몇 달 전에 우리는 여러 보고서를 동시에 열 수 있도록 이러한 보고서 뷰어 창을 모덜리스로 만들라는 고객의 요청을 받기 시작했습니다.
나는 이것이 좋은 해결책이라고 생각하지 않았기 때문에 얼마 동안이 요청에 저항했습니다. 그러나 사용자들이 우리 시스템의 '결함'을 어떻게 극복하고 있는지 알게되자 마음이 바뀌 었습니다.
그들은 뷰어를 열고 '다른 이름으로 저장'기능을 사용하여 보고서를 특정 디렉토리에 PDF로 저장하고 Acrobat Reader를 사용하여 PDF 파일을 연 다음 다음 보고서에서 동일한 작업을 수행했습니다. 보고자하는 다양한 보고서 출력과 함께 여러 Acrobat Reader가 실행됩니다.
그래서 나는 마음이 편 해졌고 시청자를 모덜리스로 만들었다. 이는 각 뷰어에 작업 표시 줄 아이콘이 있음을 의미합니다.
지난주에 그들에게 최신 버전이 공개되었을 때, 그들로부터 압도적 인 반응은 그들이 그것을 좋아한다는 것입니다. 시스템에 대한 가장 인기있는 최근 개선 사항 중 하나입니다.
따라서 사용자에게 원하는 것이 나쁘다고 말하지만 궁극적으로는 호의를 얻지 못할 것입니다.
몇 가지 참고 사항 :
- 이러한 모덜리스 창에 JDialog를 사용하는 것이 가장 좋은 방법 인 것 같습니다.
ModalityType
부울modal
인수가 아닌 new를 사용하는 생성자를 사용하십시오 . 이것이 이러한 대화 상자에 작업 표시 줄 아이콘을 제공하는 것입니다.- 모덜리스 대화 상자의 경우 생성자에 null 부모를 전달하지만 '부모'창에 상대적으로 찾습니다.
- Windows 용 Java 버전 6에는 사용자가 알리지 않고도 기본 창이 '항상 위에'표시 될 수 있는 버그 가 있습니다. 이 문제를 해결하려면 버전 7로 업그레이드하십시오.
jInternalFrame을 메인 프레임으로 만들고 보이지 않게 만듭니다. 그런 다음 추가 이벤트에 사용할 수 있습니다.
jInternalFrame.setSize(300,150);
jInternalFrame.setVisible(true);
내가 스윙을 마지막으로 만진 지 오래되었지만 일반적으로 이것을하는 것은 나쁜 습관입니다. 떠오르는 몇 가지 주요 단점 :
더 비쌉니다. Dialog 또는 JInternalFrame과 같은 다른 종류의 창 컨테이너보다 JFrame을 그리기 위해 더 많은 리소스를 할당해야합니다.
사용자 친화적이지 않음 : 서로 붙어있는 여러 JFrame을 탐색하는 것은 쉽지 않습니다. 애플리케이션이 일관성이없고 디자인이 좋지 않은 애플리케이션 세트 인 것처럼 보일 것입니다.
사용하기 쉽습니다. JInternalFrame 이것은 일종의 반론 적입니다. 이제 Desktop과 JInternalFrame 패턴을 통해 우리가 이미 생각한 것보다 훨씬 쉽고 다른 사람들이 더 똑똑합니다 (또는 여유 시간이 더 많음). 그래서 사용하는 것이 좋습니다.
확실히 나쁜 습관. 한 가지 이유는 모든 사람 JFrame
이 새로운 작업 표시 줄 아이콘을 표시 하기 때문에 '사용자 친화적'이 아니기 때문입니다 . 여러 JFrame
s를 제어 하면 머리카락이 찢어집니다.
개인적으로 나는 JFrame
당신의 종류의 응용 프로그램에 ONE 을 사용 합니다. 여러 가지를 표시하는 방법은 당신에게 달려 있습니다. Canvas
ES, JInternalFrame
, CardLayout
, 심지어는 JPanel
아마도이야.
여러 JFrame 객체 = 고통, 문제 및 문제.
여러 Jframe
s를 사용하는 것은 좋은 생각이 아닙니다.
대신에 우리가 사용할 수 JPanel
의 더 이상의 이상의 JPanel
동일한의를 JFrame
.
또한이 사이를 전환 할 수 있습니다 JPanel
. 그래서 그것은 우리에게 JFrame
.
각각에 대해 JPanel
서로 다른 것을 디자인 할 수 있으며이 모든 것이 JPanel
한 JFrame
번에 하나씩 표시 될 수 있습니다 .
이 사이를 전환하려면 with for each 또는 'JButton JPanel '을 JPanel
사용 하십시오.JMenuBar
JMenuItems
JPanel
for each
하나 이상 JFrame
은 좋은 습관이 아니지만 하나 이상을 원하면 잘못된 것은 없습니다 JFrame
.
그러나 JFrame
여러 개의 JFrame
s를 갖는 것보다 다른 요구에 맞게 변경하는 것이 좋습니다 .
프레임이 같은 크기가 될 경우 프레임을 생성하고 프레임을 대신 참조로 전달하는 것이 좋습니다.
프레임을 통과하면 프레임을 채우는 방법을 결정할 수 있습니다. 숫자 세트의 평균을 계산하는 방법이있는 것과 같습니다. 방법을 계속해서 만들겠습니까?
좋은 습관은 아니지만 사용하고 싶더라도 싱글 톤 패턴을 좋은 것으로 사용할 수 있습니다. 저는 대부분의 프로젝트에서 싱글 톤 패턴을 사용했습니다.