Java AWT / SWT / Swing : GUI를 계획하는 방법?


Answers

GUI 빌더에 대한 열렬한 팬이 아닙니다. 일반적으로 버킷로드 코드를 자동 생성하여 전체 개발 팀을 하나의 IDE로 고정시킵니다. 또한이 코드는 종종 읽을 수 없습니다 (Netbeans에서 Matisse를 사용할 때 생성 된 코드를 확인하십시오).

GUI 디자인 / 디버깅에 대한 나의 권장 사항은 다음과 같습니다.

  • main 메소드를 각 패널 (또는 "최상위"구성 요소) 구현에 추가하면 다른 개발자가 구성 요소의 모양을 쉽게 결정할 수 있습니다.
  • ActionListener 보다 Action 의 사용을 추천 해, 이러한 액션을 각 JComponentActionMap 합니다. 이것에 의해, UI가 「소유」의 JComponent (즉, 느슨한 결합)에 의해 제어되고있는 JToolBar , UI의 다른 부분 ( 「 JToolBar 」등)에 「추출」및 추가 할 수 있습니다.
  • assert를 사용하여 모든 UI 구성 요소 수정 사항이 Event Dispatch 스레드에서 발생하는지 확인하십시오. 예 : assert SwingUtilities.isEventDispatchThread() .
  • 이상한 레이아웃 동작을 디버깅하려면 컴포넌트의 배경을 빨간색으로 페인팅 해보십시오!
  • 워크 플로 이벤트 및 예외의 캡처 및보고를 중앙 ​​집중화합니다. 예를 들어, 일반적으로 UI의 상태 표시 줄에 등록 된 TaskManager 클래스를 구현합니다. 백그라운드 처리 ( SwingWorker 내에서 수행됨)는 TaskManager 의해 생성 된 Task 핸들을 전달합니다. 작업 ( setDescription(String) , setThrowable(Throwable) , cancel() )을 호출하면 상태 막대가 업데이트됩니다. 또한 "글로벌"작업을 위해 유리창을 표시하지만,이 작업은 모두 개별 SwingWorkers에서 분리 / 숨겨집니다.
  • Observer / Observable 클래스는 사용하지 말고 대신 ChangeListener , PropertyChangeListener 또는 이벤트 전달을위한 사용자 정의 리스너 구현을 사용하십시오. ObserverObject 를 이벤트로 전달하므로 클라이언트 코드가 instanceof를 사용하여 유형을 확인하고 다운 캐스트를 수행하여 코드를 읽을 수 없게 만들고 클래스 간의 관계를 명확하게 만듭니다.
  • 테이블에 1 개의 열만있는 상황에서도 JListJTable 보다 우선 사용하십시오. JList 에는 크기를 정확하게 계산하기위한 프로토 타입 값을 제공해야한다는 점을 포함하여 API에 몇 가지 불쾌한 기능이 있습니다.
  • DefaultTableModel 을 사용하지 마십시오 DefaultTableModel 일반적으로 "모델"데이터를 두 위치에 저장합니다. 실제 비즈니스 개체와 DefaultTableModel 배치 된 2D 배열 내에 있습니다. 대신에 간단히 AbstractTableModel 서브 클래스 화하면된다. 이것은 매우 쉽다. 따라서 구현은 데이터를 저장하는 데이터 구조 (예 : List )에 위임 할 수있다.
Question

작은 그래픽 사용자 인터페이스로 이미 일부 응용 프로그램을 구현했습니다. 복잡한 것은 아니지만 구성 요소가 표시되지 않거나 예상대로 작동하지 않는 문제가 발생했습니다.

이제 내 질문 :

이러한 사용자 인터페이스는 어떻게 계획합니까? 변경해야 할 때 무엇을합니까? 어떻게 이상한 행동을 디버깅합니까?

이것은 거의 모든 유형의 GUI 설계에 적용됩니다. 물론 Microsoft Visual Studio를 사용하면 디자이너에서 볼 수있는 것을 거의 얻을 수 있기 때문에 큰 장점이 있습니다.

AWT를위한 훌륭한 오픈 소스 (또는 프리웨어) 디자이너가 존재합니까? 이미 주위를 둘러 보았고 정말 지적인 것을 찾지 못했습니다.

편집 : 지금까지, 나는 또한 손으로 모든 GUI를 만들었습니다. 물론 그것은 더 깨끗한 코드이지만 때로는 레이아웃 버그를 찾는 것이 매우 어렵습니다. MS에서 제공하는 Visual Studio가 대략 깨끗한 코드를 생성 할 수 있다면 다른 것들은 왜 없습니까?

Eclipse Visual Designer에 대해 들어 봤다. 이미 생산 준비가되어 있습니까?




도구 토론 외에 몇 가지 아이디어와 생각

  1. 키보드를 누르기 전에 GUI 요소를 종이에 그립니다. 비디오 제작에 사용 된 고전적인 스토리 보드와 같습니다. 고객이있는 경우 손으로 그린 ​​(!) 디자인을 사용하여 아이디어를 전달하십시오 (단지 읽은 것, 이미 종이로 계획 한 것)
  2. MVC (Model-View-Controller) 또는 모델 뷰 발표자 패턴 구현 계획
  3. 데이터 바인딩 은 고려해야 할 훌륭한 기술입니다. 모델 (데이터)과 뷰 (GUI) 사이의 동기화를 보장하고 입력 유효성 검사, 즉석 변환 및 더 많은 유용한 것들을 제공합니다 (JFace 데이터 바인딩에 대한 링크가 제공되었지만, 다른 프레임 워크가 있습니다. 스윙 / AWT도)



NetBeans의 Matisse 편집기는 상당히 편리하지만 코드가 생성되는 코드는 매우 수수하고 레이아웃이 약합니다. 그래서 저는 WYSIWYG 프로토 타이핑을 위해 NetBeans를 사용하고 나중에 모든 것을 수동으로 레코딩하여 두 세계를 최대한 활용하고 있습니다.




손으로해라. GUI 빌더는 C #에서 '부분 클래스'개념을 사용하지 않으면 좋지 않습니다. 그렇더라도 GUI 빌더는 종종 해결할 문제보다 더 많은 문제를 야기합니다. GUI 빌더 도구를 사용하여 프로덕션 코드가 아닌 프로토 타입을 만들 수 있습니다.

또한 레이아웃을 디버깅 할 때 좋은 효과를 내기 위해 몇 년 동안 사용해 왔던 또 다른 트릭이나 "여기 실제로보고있는 패널"문제는 각각의 '컨테이너'패널에 정말 화려한 배경색 (노란색, 파란색 등)을주는 것입니다. ). 비록 그것이 단지 1 픽셀 너비 일지라도 당신이 그것을 볼 수있을 정도로 분명한 것.

그리고 간단한 대화 상자에서 가장 좋아하는 레이아웃은 BoxLayout입니다. 멋지지는 않지만 많은 상용구를 작성해야하지만 적어도 일반적으로 예상대로 작동합니다. 당신이해야 할 때까지 레이아웃을 overthink하지 마십시오.




NetBeans는 WYSIWYG 방식으로 GUI를 구현하는 최선의 선택 일지 모르지만 많은 Java 개발자는 그리 어려운 일이 아니기 때문에 손으로 GUI를 작성합니다. 귀하의 컨트롤과 당신 사이의 국경과 갭의 두께에 대한 관리 괜찮아 :)




나는 손으로 GUI 레이아웃을하는 고풍의 친구들 중 한 명이다. 나는 또한 악명 높은 GridBagLayout 두려워하지 않는다.

비주얼 에이지에서 사용 된 코딩 표준을 에뮬레이션하여 나 자신을 단순하게 유지합니다. 저는 많은 JPanels를 사용하여 GUI 부분을 구성하고 각 부분마다 자체 makeXXX() 메서드를 만들어 레이아웃하고 레이아웃합니다. 부모 패널 또는 생성자로 반환하십시오. 그렇게하면, 각 makeXXX 는 전체 작업의 작은 부분에만 집중해야합니다.

일부 구성 요소는 다양한 인스턴스 메소드로 액세스 할 수 있어야합니다. 인스턴스 필드로 선언합니다. 장식이나 레이아웃 일 뿐인 다른 것들은 makeXXX 메서드 외부에 노출 될 필요가 없습니다.

그게 대부분입니다. 나를 위해 일합니다.




GUI 개발을 위해 netbeans를 AWT / SWING에서 사용하도록 제안합니다.

감사합니다.




비주얼 GUI 디자인을 위해 일시적으로 죽어 버린 (그러나 지금은 분명히 최소한 살아있는) 플러그인 이있다. Netbeans은 여전히 ​​그것을 지원하고있다. 결과 코드는 별보다 작았습니다. 적어도 그 코드베이스로 작업해야하는 사람들은 그다지 고통스럽지 않습니다.

나에 관해서는 필자는 사전에 종이에 계획을 세우고 첫 번째 시도에서 레이아웃이있는 패널의 모든 중첩을 시도하는 경향이있다. Java GUI 코드는 본래 내 경험에 따라 쓰기 전용입니다.

지난 번 내가 그런 일을 한 후에 필요한 모든 컨트롤을 만들고 여러 패널과 레이아웃 등으로 함께 연결했습니다.이 방법은 최소한 관리가 가능하고 변경해야 할 때 너무 많은 고통없이 작업했습니다.

필자는 강력한 디자이너 지원으로 인해 Winforms 및 WPF의 특정 레이아웃에 대해 너무 많이 생각하지 않는 경향이 있습니다. 또한 WPF는 XAML에서도 매우 쉽게 처리 할 수 ​​있습니다. 부분적인 클래스는 부분적으로 디자이너가 생성하고 부분적으로 필기 코드를 사용하면 매우 즐겁습니다. 슬프게도, 자바 세계에서는 그런 것이 없습니다.




나는 나 자신을 위해 사용한다.

연필

먼저 프로토 타입을 작성한 다음 "손으로"코딩을 시작합니다 (즉, GUI 편집기를 사용하지 않음).




GUI 생성을 위해 JFormDesigner 를 사용합니다. 좋은 Java 코드를 생성하고, 생성 된 코드를 읽는 것으로부터 몇 가지 것을 배웠다. 현지화를 간단하게 만듭니다.

복잡한 레이아웃, 특히 복잡한 메뉴 바와 격자 레이아웃을 함께 결합하는 정말 빠른 방법입니다.