이미지를 표시하고 데이터베이스에서 사운드를 재생하는 응용 프로그램을 개발 중입니다. GUI에서 데이터베이스에 이미지를 추가하기 위해 별도의 JFrame을 사용할지 여부를 결정하려고합니다.
여러 JFrame 창을 사용하는 것이 좋은 방법인지 궁금합니다.
이미지를 표시하고 데이터베이스에서 사운드를 재생하는 응용 프로그램을 개발 중입니다. GUI에서 데이터베이스에 이미지를 추가하기 위해 별도의 JFrame을 사용할지 여부를 결정하려고합니다.
여러 JFrame 창을 사용하는 것이 좋은 방법인지 궁금합니다.
답변:
여러 JFrame을 사용하는 것이 좋은 방법인지 궁금합니다.
나쁜 (나쁜, 나쁜) 연습.
하나의 GUI에 많은 요소를 표시하는 방법에는 여러 가지가 있습니다.
CardLayout
(짧은 데모. ). 좋은:
JInternalFrame
/JDesktopPane
일반적으로 MDI에 사용됩니다 .JTabbedPane
구성 요소 그룹 용.JSplitPane
하나 또는 다른 것 사이의 중요성 (크기)을 나타내는 두 가지 구성 요소를 표시하는 방법은 사용자의 활동에 따라 다릅니다.JLayeredPane
훨씬 많은 ..layered 구성 요소.JToolBar
일반적으로 동작 또는 제어 그룹이 포함됩니다. GUI 주위를 드래그하거나 사용자 요구에 따라 완전히 끌 수 있습니다. 위에서 언급했듯이 부모에 따라 최소화 / 복원합니다.JList
(아래 간단한 예).JTree
.그러나 이러한 전략이 특정 사용 사례에서 작동하지 않으면 다음을 시도하십시오. 단일 main JFrame
을 설정 한 다음 프레임을 대화 상자의 부모로 사용하여 나머지 자유 부동 요소에 대해 JDialog
또는 JOptionPane
인스턴스가 표시되도록합니다.
여러 요소가 이미지 인 경우 대신 다음 중 하나를 사용하는 것이 좋습니다.
JLabel
그 순간에 사용자가 관심있는 이미지를 표시 하는 단일 (스크롤 창 중앙) 에서 볼 수 있듯이 ImageViewer
.JList
. 이 답변 에서 볼 수 있듯이 . 그 '단일 행'부분은 모두 같은 치수 인 경우에만 작동합니다. 또는 이미지를 즉석에서 스케일링 할 준비가되어 있고 모두 동일한 종횡비 (예 : 4 : 3 또는 16 : 9) 인 경우.JFrame
본 적이 없으며 설명해 주셔서 감사합니다.
다중 JFrame
접근 방식은 Swing 앱 프로그래밍을 시작한 이래 구현 한 것입니다. 대부분, 나는 더 잘 몰랐기 때문에 처음에 해냈습니다. 그러나 개발자로서의 경험과 지식이 성숙하고 훨씬 더 많은 Java 개발자의 의견을 온라인에서 읽고 흡수하기 시작 하면서 현재 프로젝트 및 향후 프로젝트 모두에서 다중 접근 방식 에서 벗어나 려고 JFrame
했습니다. )만이 ... 내 고객으로부터 저항을 얻을 ! JInternalFrame
별도의 구성 요소에 대한 "자식"창과 s 를 제어하기위한 모달 대화 상자를 구현 하기 시작하면서 고객이 불평하기 시작했습니다!내가 최선의 방법이라고 생각한 것을하고 있었기 때문에 나는 매우 놀랐다! 그러나 그들이 말하는 것처럼 "행복한 아내는 행복한 삶입니다." 고객도 마찬가지입니다. 물론 계약자이므로 최종 사용자가 개발자 인 나에게 직접 액세스 할 수 있습니다. 이는 일반적인 시나리오가 아닙니다.
그래서 저는 다중 JFrame
접근 방식 의 장점과 다른 사람들이 제시 한 단점을 신화 적 으로 설명 할 것 입니다.
JFrame
뛰어난 레이아웃 유연성 -별도의을 허용함으로써 최종 사용자가 자신의 화면에있는 내용을 분산시키고 제어 할 수 있습니다. 이 개념은 "개방적"이고 비 제한적입니다. 당신은 하나의 큰 JFrame
무리 로 갈 때 이것을 잃습니다 JInternalFrame
.JFrame
s였습니다. 그러나 데이터 입력 화면 JDialog
이 부모가 데이터 뷰어 인 사람이 되길 원했습니다 . 나는 변화를 만들어, 즉시 나는 그가 최소화하거나 닫을 수 있다는 사실에 크게 의존 최종 사용자로부터 전화 접수 뷰어 및 유지 편집기를 그가 프로그램의 다른 부분 (또는 웹 사이트, 나는 돈을 참조하면서 오픈 기억하지 마십시오). 그는입니다 하지 그가 제 할 항목 대화 상자를 필요로하므로, 다중 모니터에 뭔가 다른두 번째로, 데이터 뷰어가 완전히 숨겨져 있습니다. 이것은 불가능 JDialog
했고 확실히 불가능 JInternalFrame
했을 것입니다. 나는 JFrames
그의 정신 을 위해 분리 된 것으로 다시 바꿨지 만, 그것은 중요한 교훈을 가르쳐주었습니다.JInternalFrame
(A)보다를 JFrame
. 사실, 내 경험상 JInternalFrames
훨씬 적은 유연성을 제공합니다. 나는 JFrame
실제로 잘 작동하는 내 앱에서 s 의 열기 및 닫기를 처리하는 체계적인 방법을 개발했습니다 . 프레임 코드 자체에서 프레임을 거의 완벽하게 제어합니다. 새로운 프레임의 생성, SwingWorker
사용자 시도가 내 열어야 등, 두 번 모두를 엽니 경우 전면 프레임을 가져 / 복원, 해당 컨트롤을 배경 스레드와 EDT의 GUI 코드의 데이터 검색을이야 JFrame
들입니다 공개 정적 메소드 open()
와 공개 메소드를windowClosing()
이벤트는 나머지를 처리합니다 (프레임이 이미 열려 있습니까? 열려 있지는 않지만로드합니까? 등).이 접근법을 템플릿으로 만들었으므로 각 프레임에 대해 구현하기가 어렵지 않습니다.JFrame
더 많은 공간이 필요 하다고 말할 수 있지만 실제로 더 많은 리소스를 소비하고 있습니까? 리소스 때문에 메모리 누수가 걱정되는 경우 : 호출 하면 가비지 수집을 위해 프레임에서 사용하는 모든 리소스가 해제됩니다 (다시 말하면 정확히 동일한 우려를 불러야합니다).JInternalFrame
JFrame
dispose()
JInternalFrame
많이 썼는데 더 쓸 수있을 것 같은 느낌이 듭니다. 어쨌든, 나는 그것이 인기가없는 의견이기 때문에 단순히 투표를받지 않기를 바랍니다. 질문은 분명히 귀중한 것이며 일반적인 의견이 아닌 경우에도 귀중한 답변을 제공했으면합니다.
프레임 당 다중 프레임 / 단일 문서 ( SDI ) 대 단일 프레임 / 프레임 당 다중 문서 ( MDI )의 좋은 예는 Microsoft Excel입니다. 일부 MDI 혜택 :
SDI (단일 문서 인터페이스, 즉 모든 창에는 단일 문서 만있을 수 있음) :
MDI (여러 문서 인터페이스, 즉 모든 창에 여러 문서가있을 수 있음) :
JFrame
부모와 큰 부모 에게 모든 것을 갖는 것을 선호합니다 JTabbedPane
. 그러나 레이아웃이 다를 수있는 두 번째 창 (또는 그 이상)을 열 수 있기 때문에 SDI 애호가들이 행복하고 MDI도 하이브리드 행동을 제공합니다. 모든 경우에, 나는 항상 JInternalFrame
두 세계의 모든 불편 함을주는 끔찍한 패턴으로 간주 됩니다. 그들이 제공하는 유연성은 단지 짜증나고 실제 목적없이 많은 귀중한 화면 공간을 멀리 먹습니다.
JFrame
자체 작업 표시 줄 아이콘을 얻습니다. 때로는 이것이 정확히 원하는 것이지만 때로는 그렇지 않습니다. WinAPI에서는 구성이 쉽지만 Swing에서는 수행 할 수없는 것 같습니다.
JDialog
이상을 선택한다고 생각 합니다 JFrame
.
방금 관련된 예제와 함께 "사용자 친화적이지 않은"논증에 반대하고 싶습니다.
우리의 응용 프로그램에는 사용자가 다양한 '프로그램'을 별도의 탭으로 실행하는 기본 창이 있습니다. 가능한 한 많은 애플리케이션을이 단일 창에 유지하려고 노력했습니다.
그들이 실행하는 '프로그램'중 하나는 시스템에 의해 생성 된 보고서 목록을 제공하며, 사용자는 각 라인에서 아이콘을 클릭하여 보고서 뷰어 대화 상자를 열 수 있습니다. 이 뷰어는 보고서의 세로 / 가로 A4 페이지와 동일하게 표시되므로이 창을 좋아하는 사용자는 화면을 거의 채우면서 상당히 커집니다.
몇 달 전에 고객의 요청에 따라 이러한 보고서 뷰어 창을 모달리스로 만들었으므로 동시에 여러 보고서를 열 수있었습니다.
나는 이것이 좋은 해결책이라고 생각하지 않았기 때문에이 요청에 저항했습니다. 그러나 사용자가 시스템의 '결함'을 어떻게 극복하고 있는지 알게되면서 마음이 바뀌 었습니다.
'다른 이름으로 저장'기능을 사용하여 보고서를 특정 디렉토리에 PDF로 저장하고 Acrobat Reader를 사용하여 PDF 파일을 연 다음 뷰어와 동일한 방식으로 뷰어를 열었습니다. 보고자하는 다양한 보고서 출력으로 여러 개의 Acrobat Reader를 실행하고 있습니다.
그래서 나는 시청자를 무모하게 만들었습니다. 이는 각 뷰어에 작업 표시 줄 아이콘이 있음을 의미합니다.
지난 주에 최신 버전이 출시되었을 때, 그들로부터 압도적 인 반응은 그들이 그것을 좋아한다는 것입니다. 최근 가장 많이 개선 된 시스템 중 하나입니다.
따라서 사용자가 원하는 것이 나쁘다는 것을 사용자에게 알리지 만 궁극적으로는 그다지 좋아하지 않습니다.
몇 가지 참고 사항 :
ModalityType
부울 modal
인수가 아닌 new를 사용하는 생성자를 사용하십시오 . 이 대화 상자에 작업 표시 줄 아이콘이 표시됩니다.jInternalFrame을 메인 프레임으로 만들어 보이지 않게하십시오. 그런 다음 추가 이벤트에 사용할 수 있습니다.
jInternalFrame.setSize(300,150);
jInternalFrame.setVisible(true);
내가 스윙을 만지는 마지막 시간이 지났지 만 일반적 으로이 작업을 수행하는 것은 나쁜 습관입니다. 염두에 두어야 할 주요 단점 중 일부는 다음과 같습니다.
더 비쌉니다. Dialog 또는 JInternalFrame과 같은 다른 종류의 창 컨테이너와 같은 JFrame을 그리려면 더 많은 리소스를 할당해야합니다.
사용자 친화적이지 않음 : 여러 JFrame을 함께 탐색하는 것은 쉽지 않습니다. 애플리케이션이 일관성이없고 디자인이 잘못된 애플리케이션 세트 인 것처럼 보입니다.
JInternalFrame을 사용하는 것은 쉽습니다. 이것은 일종의 레 토르 식입니다. 이제 우리가 이미 Desktop 및 JInternalFrame 패턴을 통해 생각했던 것보다 훨씬 쉽고 다른 사람들이 더 똑똑하고 (더 많은 여가 시간이 있음) 사용하는 것이 좋습니다.
JInternalFrame
있습니까? 개인적으로의 사용에 동의하지 않습니다 JInternalFrame
! CardLayout
진정한 축복입니다!
JInternalFrame
당신이 언급 한 세 가지 각 호의 어느 하나에 해당하는 경우에 제공 어떤 장점을 (1. 어디 증거입니다 JInternalFrame
보다 가벼운 JFrame
? 2. 귀하 JInternalFrame
의 단지로의 무리로 / 혼란 / 붙어 서로를 어수선하게 할 수 JFrame
의. 3. 얼마나 JInternalFrame
쉽게? 그것은이다 하나를 제외하고 똑같은 코드는 포함되어 JDesktopPane
하나는 자연의 화면 영역에 포함되어 그들은 나에게 똑같이 복잡한 소리)..
JComponent
s이며 둘 다 거의 동일한 구조를 가지고 있습니다 JDesktop
. 다시 한번 죄송하지만, 귀하의 "무게"에 대해 추측하고 있다고 생각합니다 JFrame
. 2. 내 응용 프로그램은 SDI를 사용하며 클라이언트는 매우 행복합니다. 그러나, 당신은 "많은 창문"이라고 말했는데, 물론 그것은 빨라질 것입니다. 하지만, 제 요점은 이것이다 : "톤" JInternalFrame
의 그냥 나쁜로 빨아 것입니다! JIF를 통해 느슨한 UI 디자이너가 될 수 있다면 끔찍한 일입니다. 어수선한 혼란은 JF이든 JIF이든 어수선한 혼란입니다.
확실히 나쁜 연습. 한 가지 이유는 모두 JFrame
가 새로운 작업 표시 줄 아이콘을 표시 한다는 사실 때문에 '사용자 친화적'이 아니기 때문입니다 . 여러 개를 제어 JFrame
하면 머리카락이 찢어집니다.
개인적으로, 나는 JFrame
당신의 응용 프로그램에 ONE 을 사용할 것 입니다. 여러 가지를 표시하는 방법은 당신에게 달려 있습니다. Canvas
ES, JInternalFrame
, CardLayout
, 심지어는 JPanel
아마도이야.
여러 JFrame 객체 = 통증, 문제 및 문제
여러 Jframe
s를 사용하는 것은 좋은 생각이 아니라고 생각합니다.
대신 우리는 JPanel
s JPanel
에서 하나 이상을 사용할 수 있습니다 JFrame
.
또한이 JPanel
s를 전환 할 수 있습니다 . 따라서에있는 것 이상을 자유롭게 표시 할 수 JFrame
있습니다.
각각에 대해 JPanel
서로 다른 것을 디자인 할 수 있으며이 모든 것을 JPanel
한 JFrame
번에 하나씩 표시 할 수 있습니다 .
이 사이를 전환하는 방법 JPanel
의 사용 JMenuBar
으로 JMenuItems
각각 JPanel
또는 'JButton를 for each
JPanel`.
둘 이상 JFrame
은 좋은 습관이 아니지만 둘 이상을 원한다면 아무런 문제가 없습니다 JFrame
.
그러나 JFrame
여러 가지가 아닌 다른 요구에 맞게 변경하는 것이 좋습니다 JFrame
.
프레임의 크기가 같으면 프레임을 만들고 프레임을 참조로 전달하지 않는 것이 좋습니다.
프레임을 통과하면 프레임을 채우는 방법을 결정할 수 있습니다. 그림 집합의 평균을 계산하는 방법을 갖는 것과 같습니다. 메소드를 반복해서 작성 하시겠습니까?
좋은 방법은 아니지만 사용하려는 경우에도 싱글 톤 패턴을 좋은 것으로 사용할 수 있습니다. 나는 대부분의 프로젝트에서 싱글 톤 패턴을 사용했다.