[java] 다중 JFrame 사용 : 우수 또는 우수 사례? [닫은]

이미지를 표시하고 데이터베이스에서 사운드를 재생하는 응용 프로그램을 개발 중입니다. GUI에서 데이터베이스에 이미지를 추가하기 위해 별도의 JFrame을 사용할지 여부를 결정하려고합니다.

여러 JFrame 창을 사용하는 것이 좋은 방법인지 궁금합니다.



답변

여러 JFrame을 사용하는 것이 좋은 방법인지 궁금합니다.

나쁜 (나쁜, 나쁜) 연습.

  • 사용자에게 친숙하지 않음 : 사용자에게는 하나만 표시 될 때 작업 표시 줄에 여러 개의 아이콘이 표시됩니다. 또한 코딩 문제의 부작용 ..
  • 코딩하고 유지해야하는 악몽 :
    • 모달 대화는 그 대화의 내용에 대한 이벤트 초점주의에 쉽게 기회를 – 선택 / 수정 /이를 취소 한 후 진행합니다. 여러 프레임은 그렇지 않습니다.
    • 부모를 클릭하면 부모가있는 대화 상자 (또는 플로팅 도구 모음)가 맨 앞에 나타납니다. 원하는 동작 인 경우 프레임으로 구현해야합니다.

하나의 GUI에 많은 요소를 표시하는 방법에는 여러 가지가 있습니다.

  • CardLayout(짧은 데모. ). 좋은:
    1. 대화 상자와 같은 마법사 표시
    2. 연관된 구성 요소가있는 항목의 목록, 트리 등 선택 사항 표시
    3. 구성 요소가없는 것과 보이는 구성 요소 사이를 뒤집습니다.
  • JInternalFrame/JDesktopPane 일반적으로 MDI에 사용됩니다 .
  • JTabbedPane 구성 요소 그룹 용.
  • JSplitPane 하나 또는 다른 것 사이의 중요성 (크기)을 나타내는 두 가지 구성 요소를 표시하는 방법은 사용자의 활동에 따라 다릅니다.
  • JLayeredPane 훨씬 많은 ..layered 구성 요소.
  • JToolBar일반적으로 동작 또는 제어 그룹이 포함됩니다. GUI 주위를 드래그하거나 사용자 요구에 따라 완전히 끌 수 있습니다. 위에서 언급했듯이 부모에 따라 최소화 / 복원합니다.
  • 의 항목으로 JList(아래 간단한 예).
  • 의 노드로 JTree.
  • 중첩 된 레이아웃 .

그러나 이러한 전략이 특정 사용 사례에서 작동하지 않으면 다음을 시도하십시오. 단일 main JFrame을 설정 한 다음 프레임을 대화 상자의 부모로 사용하여 나머지 자유 부동 요소에 대해 JDialog또는 JOptionPane인스턴스가 표시되도록합니다.

많은 이미지

여러 요소가 이미지 인 경우 대신 다음 중 하나를 사용하는 것이 좋습니다.

  1. JLabel그 순간에 사용자가 관심있는 이미지를 표시 하는 단일 (스크롤 창 중앙) 에서 볼 수 있듯이 ImageViewer.
  2. 단일 행 JList. 이 답변 에서 볼 수 있듯이 . 그 ‘단일 행’부분은 모두 같은 치수 인 경우에만 작동합니다. 또는 이미지를 즉석에서 스케일링 할 준비가되어 있고 모두 동일한 종횡비 (예 : 4 : 3 또는 16 : 9) 인 경우.


답변

다중 JFrame접근 방식은 Swing 앱 프로그래밍을 시작한 이래 구현 한 것입니다. 대부분, 나는 더 잘 몰랐기 때문에 처음에 해냈습니다. 그러나 개발자로서의 경험과 지식이 성숙하고 훨씬 더 많은 Java 개발자의 의견을 온라인에서 읽고 흡수하기 시작 하면서 현재 프로젝트 및 향후 프로젝트 모두에서 다중 접근 방식 에서 벗어나 려고 JFrame했습니다. )만이 … 내 고객으로부터 저항을 얻을 ! JInternalFrame별도의 구성 요소에 대한 “자식”창과 s 를 제어하기위한 모달 대화 상자를 구현 하기 시작하면서 고객이 불평하기 시작했습니다!내가 최선의 방법이라고 생각한 것을하고 있었기 때문에 나는 매우 놀랐다! 그러나 그들이 말하는 것처럼 “행복한 아내는 행복한 삶입니다.” 고객도 마찬가지입니다. 물론 계약자이므로 최종 사용자가 개발자 인 나에게 직접 액세스 할 수 있습니다. 이는 일반적인 시나리오가 아닙니다.

그래서 저는 다중 JFrame접근 방식 의 장점과 다른 사람들이 제시 한 단점을 신화 적 으로 설명 할 것 입니다.

  1. JFrame뛰어난 레이아웃 유연성 -별도의을 허용함으로써 최종 사용자가 자신의 화면에있는 내용을 분산시키고 제어 할 수 있습니다. 이 개념은 “개방적”이고 비 제한적입니다. 당신은 하나의 큰 JFrame무리 로 갈 때 이것을 잃습니다 JInternalFrame.
  2. 매우 모듈화 된 응용 프로그램에 적합 -제 경우에는 대부분의 응용 프로그램이 서로간에 전혀 관련이없는 3-5 개의 큰 “모듈”을 가지고 있습니다. 예를 들어, 하나의 모듈은 영업 대시 보드이고 다른 하나는 회계 대시 보드 일 수 있습니다. 그들은 서로 또는 아무 말도하지 않습니다. 그러나 경영자는 두 가지를 모두 열어야 할 수도 있고 작업 표시 줄의 별도 프레임으로 인해 삶이 ​​더 쉬워졌습니다.
  3. 최종 사용자가 외부 자료를 쉽게 참조 할 수 있도록합니다 .-일단 다음 상황이 발생했습니다. 내 앱에 “데이터 뷰어”가있어 “새로 추가”를 클릭하면 데이터 입력 화면이 열립니다. 처음에는 둘 다 JFrames였습니다. 그러나 데이터 입력 화면 JDialog이 부모가 데이터 뷰어 인 사람이 되길 원했습니다 . 나는 변화를 만들어, 즉시 나는 그가 최소화하거나 닫을 수 있다는 사실에 크게 의존 최종 사용자로부터 전화 접수 뷰어 및 유지 편집기를 그가 프로그램의 다른 부분 (또는 웹 사이트, 나는 돈을 참조하면서 오픈 기억하지 마십시오). 그는입니다 하지 그가 제 할 항목 대화 상자를 필요로하므로, 다중 모니터에 뭔가 다른두 번째로, 데이터 뷰어가 완전히 숨겨져 있습니다. 이것은 불가능 JDialog했고 확실히 불가능 JInternalFrame했을 것입니다. 나는 JFrames그의 정신 을 위해 분리 된 것으로 다시 바꿨지 만, 그것은 중요한 교훈을 가르쳐주었습니다.
  4. 오해 : 코딩하기 어려움-이것은 내 경험에 해당되지 않습니다. 만들 수있는 쉬울 것 왜 표시되지 않습니다 JInternalFrame(A)보다를 JFrame. 사실, 내 경험상 JInternalFrames훨씬 적은 유연성을 제공합니다. 나는 JFrame실제로 잘 작동하는 내 앱에서 s 의 열기 및 닫기를 처리하는 체계적인 방법을 개발했습니다 . 프레임 코드 자체에서 프레임을 거의 완벽하게 제어합니다. 새로운 프레임의 생성, SwingWorker사용자 시도가 내 열어야 등, 두 번 모두를 엽니 경우 전면 프레임을 가져 / 복원, 해당 컨트롤을 배경 스레드와 EDT의 GUI 코드의 데이터 검색을이야 JFrame들입니다 공개 정적 메소드 open()와 공개 메소드를windowClosing() 이벤트는 나머지를 처리합니다 (프레임이 이미 열려 있습니까? 열려 있지는 않지만로드합니까? 등).이 접근법을 템플릿으로 만들었으므로 각 프레임에 대해 구현하기가 어렵지 않습니다.
  5. 오해 / 증명되지 않은 : 리소스가 많이 소모 됨 -이 추측에 대한 몇 가지 사실을 알고 싶습니다. 비록 100 초 를 열어도 JFrame더 많은 공간이 필요 하다고 말할 수 있지만 실제로 더 많은 리소스를 소비하고 있습니까? 리소스 때문에 메모리 누수가 걱정되는 경우 : 호출 하면 가비지 수집을 위해 프레임에서 사용하는 모든 리소스가 해제됩니다 (다시 말하면 정확히 동일한 우려를 불러야합니다).JInternalFrameJFramedispose()JInternalFrame

많이 썼는데 더 쓸 수있을 것 같은 느낌이 듭니다. 어쨌든, 나는 그것이 인기가없는 의견이기 때문에 단순히 투표를받지 않기를 바랍니다. 질문은 분명히 귀중한 것이며 일반적인 의견이 아닌 경우에도 귀중한 답변을 제공했으면합니다.

프레임 당 다중 프레임 / 단일 문서 ( 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하면 머리카락이 찢어집니다.

개인적으로, 나는 JFrame당신의 응용 프로그램에 ONE 을 사용할 것 입니다. 여러 가지를 표시하는 방법은 당신에게 달려 있습니다. CanvasES, JInternalFrame, CardLayout, 심지어는 JPanel아마도이야.

여러 JFrame 객체 = 통증, 문제 및 문제


답변

여러 Jframes를 사용하는 것은 좋은 생각이 아니라고 생각합니다.

대신 우리는 JPanels JPanel에서 하나 이상을 사용할 수 있습니다 JFrame.

또한이 JPanels를 전환 할 수 있습니다 . 따라서에있는 것 이상을 자유롭게 표시 할 수 JFrame있습니다.

각각에 대해 JPanel서로 다른 것을 디자인 할 수 있으며이 모든 것을 JPanelJFrame번에 하나씩 표시 할 수 있습니다 .

이 사이를 전환하는 방법 JPanel의 사용 JMenuBar으로 JMenuItems각각 JPanel또는 ‘JButton를 for eachJPanel`.

둘 이상 JFrame은 좋은 습관이 아니지만 둘 이상을 원한다면 아무런 문제가 없습니다 JFrame.

그러나 JFrame여러 가지가 아닌 다른 요구에 맞게 변경하는 것이 좋습니다 JFrame.