Java 프로그램을 '기본 모양'으로 만드는 것이 어려운 이유는 무엇입니까?


98

대부분의 Java 응용 프로그램은 C / C ++ 응용 프로그램과 동일하게 보이지 않습니다. Swing은 의도적으로 눈에 띄지 않게 디자인되었지만, 내가 읽은 내용을 기반으로 SWT는 예를 들어 '기본 모양'을 시도했지만 완전히 성공하지 못했습니다.

내 질문은 :

Java 언어 개발자 가 기본 GUI의 모양을 정확하게 복사하는 GUI 시스템을 설계하기 어려운 이유는 무엇 입니까? 기본 GUI의 차이점은 무엇입니까? '네이티브'버튼처럼 보이는 버튼을 디자인하는 것이 문제가 아닌가? 아니면 그것보다 더 깊어 집니까?


31
swing은 이식성이라는 개념에서 실제 네이티브 컴포넌트에 대한 바인딩을 만드는 대신 네이티브 네이티브를 모방하려고하는 자체 GUI 컴포넌트를 작성하기 때문입니다.
ratchet freak

5
저는이 주제에 대한 전문가는 아니지만 GUI 툴킷 공급 업체가 모든 세부 사항을 제대로 이해하기 위해 얼마나 많은 노력을 기울이고 있는지에 대한 문제 일뿐입니다. 예를 들어 C ++ 프레임 워크 "Qt"와이 SO 질문을 참조하십시오. stackoverflow.com/questions/7298441/…
Doc Brown

4
처리해야 할 많은 세부 사항이 있습니다. 예를 들어 파일 열기 대화 상자에서 자동 완성 기능이 작동하는 방식은 네이티브 Java 응용 프로그램이 고장난 지점입니다.
코드 InChaos

4
Swing에는 기본 모양 대신 연결할 수있는 "기본 모양"모양이 있습니다. 또한 Java는 먼저 AWT와 함께 사용 가능한 기본 기능을 사용하려고 시도했지만 플랫폼 간의 고유 한 차이로 인해 AFAIK가 제대로 작동하지 않았습니다. 이것이 자바 애플리케이션이 어디에서나 동일하게 작동하도록 Swing을 만든 이유입니다.
marczellm

5
JavaFX를 간과하지 마십시오. SWING 대체품이며 Java 8부터 기본적으로 JDK / JRE에 있습니다. SWING 및 AWT보다 훨씬 현대적이며 거의 모든 플랫폼에서 훨씬 더 기본적으로 보입니다 (각 플랫폼의 고유 UI 툴킷에 많이 연결됨) 플랫폼). 다른 사람들이 언급했듯이 Java와 같은 "하나의 크기에 맞는"언어에서 정확히 네이티브 응용 프로그램을 얻으려면 몇 가지 작업을 수행해야합니다. Java UI는 기본적으로 "모든 플랫폼에 가장 적합"하도록 설계되었습니다.
SnakeDoc 2019

답변:


56

'네이티브'버튼처럼 보이는 버튼을 디자인하는 것이 문제가 아닌가?

글쎄요, 일종의 버튼입니다. 그러나 이것은 당신이 상상하는 것보다 어려울 수 있습니다. 요즘 GUI 구성 요소를 나타내는 데 사용되는 그래픽은 확장되지 않은 임의의 비트 맵만큼 간단하지 않습니다.이 비트는 전혀 확장되지 않기 때문에 종종 코너 기반 사례가 많은 벡터 기반 그래픽입니다 ( 버튼이 화면 가장자리에 도달하면 예를 들어 약간 다르게 보일 수 있습니다.) 물론 버튼을 클릭하면 다른 그래픽이 필요합니다. 저작권상의 이유로 개발자는 이러한 기존 그래픽을 그대로 사용할 수없는 경우가 많으므로 다시 작성해야합니다. 대부분 좋은 작업을 수행하는 동안 불가피하게도 그래픽 구성 요소가 너무 많아 일부 항목을 놓치게됩니다.

물론 위의 모든 내용은 Swing을 기반으로합니다. 물론 경량의 기본이 아닌 GUI 툴킷입니다. SWT 가 네이티브 이기 때문에 SWT 가 네이티브 처럼 보이지 않습니다 . JNI를 사용하여 기본 구성 요소를 호출하는 툴킷이므로 무언가가 제대로 보이지 않으면 모양과 느낌으로 인한 것이 아닙니다.


1
감사. '경량'은 정확히 무엇을 의미합니까? 그리고 '네이티브'는 실제로 무엇을 의미합니까? 컴퓨터의 OS에서 리소스를 사용하거나 직접 상호 작용하는 것을 의미한다고 가정합니다. 이것이 사실입니까?
user3150201

1
물론 @ user3150201 따라서 기본 OS에는 기본적으로 배치 할 수있는 버튼과 위젯이 설정되어 있지만,이 버튼은 OS와 플랫폼마다 다를 수 있습니다. 경량 구성 요소는 OS가 지시하는 구성 요소가 아니며 Java (이 경우)에서 GUI 구성 요소처럼 보이고 동작하도록 그려져 있습니다. 따라서 작업을 넣을 경우 원하는대로 볼 수 있습니다 (그러나 에뮬레이션해야합니다) 원하는 경우 플랫폼의 모양과 느낌을 무료로 얻지 못합니다.)
berry120

14
버튼, 정확한 크기 및 선호하는 GUI 스타일의 배치는 플랫폼에 따라 다르며 Java가이를 모방하도록하는 데는 시간이 걸립니다. 스윙은 기본 버튼을 줄 수 있지만 키가 10 픽셀 인 경우 사용자는 여전히 무언가가 꺼져 있다고 생각합니다. Apple에는 휴먼 인터페이스 지침이 있고 Microsoft에는 올바른 기본 모양을 얻는 데 도움 이되는 사용자 인터페이스 지침 이 있습니다. 플랫폼간에 UI를 약간 변경해야합니다.
Michael Shopsin

4
JavaFX는 SWING 및 AWT보다 훨씬 "기본"으로 나타납니다. 기본 투명 창 등이 있습니다. 훨씬 더 현대적으로 보입니다.
SnakeDoc

2
@SnakeDoc 더 현대적인 것처럼 보이지만 "네이티브"라고 말하지는 않을 것입니다. 확실히 플랫폼의 기본 GUI 구성 요소를 사용하지 않으며 CSS로 모두 스킨 처리되어 있습니다.
berry120

71

일부 시스템에서는 문자 그대로“네이티브”로 간주 될 수있는 툴킷이 수십 개가 있습니다. 이들 중 일부는 고유 한 개념이나 기능을 가지고 있으며이를 크로스 플랫폼 툴킷으로 복제하는 것은 지루합니다. 응용 프로그램의 모양과 느낌은 "스킨"에 의해 결정될뿐만 아니라 레이아웃과 작동 방식에 따라 결정됩니다. 몇 가지 고려 사항 :

  • 대화 상자에서“OK”버튼은 어느쪽에 있습니까? 왼쪽 또는 오른쪽? 충분합니다. 각 시스템마다 별도의 대화 상자를 만들어 봅시다.
  • 화면에서 기본 버튼을 어떻게 표시합니까? 컬러 틴팅, 굵은 글꼴, 버튼 확대? 충분히, 스타일 시트에 넣자.
  • Windows에서 "리본"개념은 다소 고유합니다. 리본이 일반적이지 않은 Mac으로 어떻게 변환됩니까? 충분하지만 픽셀 단위의 정확한 레이아웃을 잊어 버리고 각 시스템마다 다른 툴바 구현을 제공합니다.
  • 메뉴 막대가 창의 일부입니까 (Windows, 선택적으로 KDE) 또는 화면 맨 위에 있습니까 (Mac, Unity)? 충분히 픽셀 단위의 레이아웃을 이미 버렸으므로 각 시스템마다 다른 구현을 작성해 봅시다.
  • 글꼴은 어떻게 렌더링됩니까? 가능한 한 선명합니까, 매끄럽고 앤티 앨리어싱입니까? 어떤 글꼴을 사용해야합니까? 글꼴마다 다른 메트릭이 있으므로 동일한 너비로 렌더링 된 동일한 단락의 글꼴에 따라 줄 수가 다를 수 있습니다.
  • 창의 배경이 단색, 이미지 또는 그라디언트입니까? 스타일 시트에도 넣겠습니다.
  • 스크롤바는 어떻게 보입니까? 버튼이 있다면 어디에 있습니까? 포인터가 특정 영역으로 움직일 때 얼마나 넓습니까?
  • 다른 색 구성표를 어떻게 통합합니까?
  • 드래그 가능한 것은 무엇입니까? 상황에 맞는 메뉴는 어디에 있습니까?

이러한 문제는 응용 프로그램의 동작 또는 일반 레이아웃을 터치 할 때 간단한 스타일 시트를 통해 해결할 수 없습니다. 유일한 해결책은 각 시스템에 대해 응용 프로그램을 다시 작성하는 것입니다 (따라서 Java의 크로스 플랫폼 이점을 무시 함). 유일한 현실적인 솔루션은 픽셀 단위의 정확한 레이아웃을 잊고 시스템 별 툴킷을 통해 추상화되는 공통 인터페이스에 쓰는 것입니다. Swing이 취한 해결책은 다양한 시스템을 모방하는 것입니다.

그리고 모든 플랫폼에서 앱이 똑같이 보일 수 있다는 플랫폼 간 일관성이 있습니다. 데스크톱 응용 프로그램에서 이는 성가 시며 사용자의 기대를 무너 뜨립니다.


1
+1. 내가 추가하고 싶은 한 가지 : 상황에 맞는 메뉴를 여는 방법과 같은 "간단한"세부 사항부터 시작하여 시스템에서 사용자가 구성 할 수있는 항목은 무엇입니까? (그리고 나는 많은 리본을 가지고 Windows 프로그램을 선호하는 것 및 Mac은하지에, 당신은 예, 좋은 GUI를가 OS에 따라 설계 할 필요가 감사 애플 리케이션..)
크리스토퍼 Creutzig

@ChristopherCreutzig 그 경험은 다음과 같습니다. 기본 데스크탑에서는 Linux에서 KDE를 사용하고 (둘 다 구성 가능) QtCurve를 사용하여 응용 프로그램의 모양을 조정합니다. 이러한 특수 스타일은 주력 KDE 응용 프로그램에서 잘 작동합니다. 잘 작성된 GTK 앱은 호환성 레이어를 사용할 수 있지만 배경 그라디언트가 누락되고 메뉴 막대가 창 내부에 유지됩니다. 그러나 프로그램은 시스템 스타일에서 일부 위젯 (예 : 스크롤 막대)을 사용하여 빠르게 저하되기 시작합니다. , 글꼴 렌더링 또는 메뉴 주변의 그림자와 같은 다른 사람은 무시합니다.
amon

이 답변에는 장점이 있지만 +1도 있기 때문에 +1입니다. "이 창 관리자가 X를 그리는 방법"문제는 기본 API를 사용하여 처리됩니다. 예를 들어, OS X의 X11은 기본 OS X 창, 단추, 스크롤 막대, 대화 상자 등을 그릴 수 있습니다. 따라서 이러한 많은 문제가 사라집니다. 실제 UX는 다음과 같습니다 대답은 @TheSpooniest 아래 말한 훨씬 더 단지 그리기 위젯보다. 간격, 타이밍, 애니메이션, 마우스 가속, 터치 입력 ... 크로스 플랫폼 툴킷으로 재현하는 데 매우 비싼 미묘한 세부 사항의 세계가 있습니다.
Mark E. Haase

13

그렇습니다.

이 버튼 만 만들면 Windows 또는 OS X 버튼처럼 보이는 버튼을 쉽게 작성할 수 있습니다. 그러나 버튼은 원래 버튼과 같이 "동작"해야합니다. 쉽지 않을 수 있습니다. 사용 가능한 버전 하나에 더 많은 공간이 있지만 다른 버전에는 없을 수 있습니다. Windows 버전의 디자인에 색상이 더 적합 할 수도 있습니다.

전체 GUI가 있으면 OS X 프로그램의 내용이 Windows 프로그램과 다르게 표시됩니다. 이것은 하나의 GUI에서 캡처하는 것이 불가능한 것입니다. 두 개의 GUI가 필요하지만 많은 응용 프로그램이 그렇게 소란스럽지 않습니다. 대신에 그들은 "대부분의 시스템에서 괜찮아 보인다"는 것을 목표로하고있다. 이것은 여전히 ​​다소 외계인이지만, 사용하기 쉽고 개발하기가 훨씬 쉽다.


9

OSX 버튼, Windows 버튼 또는 다른 툴킷과 같은 버튼을 만드는 것은 어렵지 않습니다. 그러나 대부분의 환경에 대한 UI 지침은 "이것은 버튼 모양"의 기본만큼 간단하지 않습니다. UI 요소 사이의 간격에서 메뉴 시스템의 기본 설정 / 옵션 대화 상자의 정확한 위치까지 목록에서 잘 알려진 특정 동작이 나타나는 순서에 이르기까지 미묘한 차이가 있습니다. 매우 간단한 사용자 인터페이스를 위해 가장 일반적인 경우를 자동화 할 수 있지만 대부분의 UI 작업은 훨씬 미세한 터치가 필요합니다.

SWT는 이것을 어느 정도 자동화하려고 시도했지만 다시 한번 간단한 UI 작업에 적합합니다. 그러나 모든 규모에 맞는 솔루션은 없으므로 UI가 복잡해지면 사용하는 기본 방법이 무너지기 시작합니다. 일반적으로 번거로운 수동 UI 작업으로 다시 가져올 수 있지만 대부분의 프로그래머가 모든 플랫폼에서 할 수 있거나 기꺼이 할 수있는 것은 아닙니다.

이에 대한 Swing의 접근 방식은 가능한 경우 기본 툴킷을 간단히 피하는 것이 었습니다. 네이티브가 아니며 시도하지 않습니다. 대신, 실행되는 위치에 관계없이 (거의) 똑같이 보이는 무언가를 만들려고 시도합니다. 모든 사람을 기쁘시게하려고 노력하기보다는 스스로를 기쁘시게하려고 노력했지만 그것이 성공하는 한 그 결과가 더 광범위한 사용자 커뮤니티에 얼마나 효과적인지 의문을 가질 수 있습니다.


7

응용 프로그램이 모든 시스템에서 가능한 한 자연스럽게 보일 것을 기대하고 각 시스템에서 응용 프로그램이 동일한 방식으로 작동 할 것을 기대하는 것 사이에는 상충 관계가 있습니다. "올바른"선택은 없습니다.

또한 "자연스럽게 보이는"면을 선택하더라도 기본 툴킷 및 API의 "개선"으로부터 그래픽 툴킷 사용자를 보호하여 응용 프로그램이 예기치 않게 중단 될 수 있습니다.

그렇기 때문에 일부 GUI 툴킷 개발자는 기본 구성 요소를 모방하지만 자체 구현을 제공하는 자체 구성 요소를 제공하는 것을 선호합니다. 다른 한편으로, 기능적으로 완전한 GUI 툴킷을 개발하는 것은 상당한 노력이며 경제적 인 고려 사항은 약간의 우위를 깎을 수 있습니다.

이 문제는 Java에만 국한된 것이 아니라 플랫폼 독립적 툴킷을 생산하는 모든 회사가 직면하고 있습니다.


자동 다운 다운을하기보다는 답변에 문제가 있다고 생각하여 커뮤니티에 더 큰 서비스를 제공해야합니다. 개인적인 문제가 아니라면 ...
Nicola Musatti

4

그것은 역사로 인한 것입니다.

Sun은 모든 Java 소프트웨어가 모든 시스템에서 동일하게 작동하기를 원했습니다.

소프트웨어가 "기본으로"나타나려면 지정된 OS의 다른 소프트웨어와 동일하게 작동해야합니다.

OS와의 통합으로 인해 각 OS에서 소프트웨어가 다르게 작동하므로 Sun은 OS와 통합 된 Java 소프트웨어를 작성하기 어렵게하기 위해 모든 노력을 기울였습니다.

요즘에는 웹 서버 기반 소프트웨어 이외의 다른 것에 관심이있는 Java 프로그래머는 거의 없습니다.

Sun은 Microsoft Java 기반 시스템을 사용하는 모든 프로그래머를 축으로 데스크탑에서 Java를 중단했습니다. 따라서 초기에 Java를 선택하는 모든 프로그래머가 나빠 보이게 만들었습니다.

“기본 모양”에 관심이있는 데스크탑 소프트웨어를 작성하는 사람은 오랫동안 Java를 사용하지 않는 법을 배웠으며 Oracle 소프트웨어를 사용할 때마다 견해가 강화되었습니다.

따라서 요즘에는 Java 프로그래머의 데스크탑 소프트웨어에 "기본 모양"이 필요하지 않습니다.


5
"Sun은 OS와 통합 된 Java 소프트웨어를 작성하기 어렵게하기 위해 모든 힘을 다했습니다." 그들은 쉽게 만들기 위해 큰 노력을 기울이지 않았습니다. "Sun은 Microsoft Java 기반 시스템을 사용하는 모든 프로그래머를 동원하여 데스크탑에서 Java를 종료했습니다."Microsoft와 Sun의 상호 적의로 인해 Microsoft는 Sun의 요구 사항과 호환되지 않는 AWT 라이브러리 버전을 만들어 악명 높은 Sun / MS 소송.
jwenting February

1
@jwenting에서 Sun은 Microsoft의 문제를 Microsoft의 Java 기반 시스템을 사용하기로 선택한 프로그래머에 대해 관심을 기울였습니다. 따라서 나는 Jave 포기와 C #이 나올 때까지 MFC로 유지했다.
Ian

3
어쩌면 썬의 일부 사람들이지만 그 감정은 상호였습니다. 단일 플랫폼 전용으로 개발하는 경우 해당 플랫폼의 기본 도구는 항상 선호되는 옵션이며 이는 회사 정치와 관련이 없습니다. "나는 햇볕을 싫어한다"또는 "나는 싫다"를 기준으로 도구를 선택하면 전문적인 태도에 매우 취약합니다. 나는 주로 Java를 사용했지만 그와 함께 Delphi, C #, Ruby, C ++, C, Progress 등을 사용했습니다. 그리고 그보다 더 자주 하이브리드 솔루션이 될 것입니다.
jwenting

3

당신이 생각하는 것은 native실제로 SWT 같은 툴킷은 그 OS의 UI에 대한 게시 된 표준을 준수하면서 자신의 일을하고 네이티브 응용 프로그램입니다. 문제는 아무도 Java 앱을 실행할 때 해당 표준에 따라 앱을 빌드하지 않는다는 것입니다. 네이티브가 아닌 것 같습니다. 예를 들어, 거의 모든 Microsoft 프로젝트 (Office, Outlook 등)는 Windows 표준 컨트롤을 사용하여 시각적으로 재현 할 수 없습니다.

Microsoft와 Apple 모두 OS 플랫폼에 동적 UI 기능을 추가함에 따라 더욱 악화 될 것입니다. 개발자가 웹 디자인에서 웹 사이트 스타일을 만드는 것과 거의 같은 방식으로 앱을 스킨 / 스타일링 할 수 있습니다.

Android 플랫폼의 Java가이 경로를 따르고 있습니다. 스킨 스타일을 사용하여 Android 용 UI 요소를 XML로 정의합니다.

Java는 데스크탑 플랫폼으로 인기가 없었습니다. 결과적으로 업계의 이러한 변경 사항은 데스크톱 런타임으로 전파되지 않습니다. 이 문제를 해결하기 위해 시간을 할애 할 개발자가 충분하지 않습니다.


1
+1, Windows 95 시대에는 Windows 컨트롤에 대한 '표준'모양이있었습니다. 이제는 그렇게 많지 않습니다.
GrandmasterB

예, 데스크톱을 프로그래밍 한 지 몇 년이 지났지 만 .NET이 MS 내장 생산성 소프트웨어의 필수 요소가되었지만 리본 스타일 컨트롤이 제공되지 않았다는 사실에 놀랐습니다.
Rig

@Rig NET 4.0 이후 .NET에는 좋은 기본 리본 컨트롤이 있습니다. 다음은 좋은 기사입니다. c-sharpcorner.com/UploadFile/0b73e1/ribbon-control-in-wpf-4-5
Christian Sauer

1
@Rig .NET 4가 아닌 .NET 4.5가 필요합니다. Visual Studio 2010은 최대 4 개까지만 타겟팅 할 수 있습니다. 4.5를 타겟팅하려면 VS2012 이상이 필요합니다. VS2013에서 4.5를 타겟팅 할 때 볼 수 있지만 대상 버전을 4로 변경할 때는 볼 수 없습니다.
Bob

1
그것은 인터넷 4.0의 리본을 사용할 수 @Rig - 당신은 마이크로 소프트에서 다운로드 할 수 있습니다 다음이 표시됩니다 : 10rem.net/blog/2010/10/22/wpf-ribbon-october-release (이 경우 확실하지 않음을 최신 버전입니다). Nuget에서 다운로드하는 것이 좋습니다. Windows XP에서 실행 해야하는 프로그램 에서이 작업을 수행해야했습니다. 잘 작동하고 대부분 Net 4.5 변형과 호환되므로 XP가 마침내 종료되면 4.0을 제거 할 수 있습니다.
Christian Sauer

-1

어떤 운영 체제를 "기본"으로 보시겠습니까?

당신 은 시간의 100 % 그들 모두에게 고유 할 수 없습니다 .

SWT 등은 타협점 에 도달해야 할 때 얻을 수있는 것처럼 모든 것에 고유하게 보이기위한 최선의 노력 입니다.

실제로이 타협은 점점 더 어려워지기 시작합니다. 운영 체제 때문이 아니라 입력 장치 때문입니다. 터치 스크린의 경우 마우스 오른쪽 버튼이 없기 때문에 실제로 다르게 디자인 해야 합니다. 따라서 그렇지 않으면 동일한 기능을 수용해야합니다.

마법없이, guestures에 마우스 오른쪽 버튼에서 "직관적으로"기능을 이동 버튼이 없을 것 당신이 어떤 시점에서, 당신은 당신이 생각 한 모든 플랫폼에 네이티브 (모든 단일 입력 장치에 대한 모든 세부적인 측면을 specifiying, 그럼에도 불구하고 비 -당신이 고려 하지 않은 것에 대한 네이티브 ).


-2

정말 좋은 질문입니다. 나는 지난 몇 년 동안 항상 그것에 대해 궁금해했습니다. 이것 뒤에 정당한 이유가 있다고 생각했지만 실제로는 그렇지 않습니다.

나는 대답이 다소 간단하다고 생각하며 많은 대답이 실제로 문제에 파고 들지 않습니다.

언어가 화면에 piexel을 그릴 수 있다면 Windows 양식 컨트롤 모양과 느낌을 정확하게 모방하는 GUI 프레임 워크를 100 % 만들 수 있습니다.

Java는 크로스 플랫폼이기 때문에 실제 실행중인 시스템 유형 (Mac / Windows) UI를 기반으로 런타임 플랫폼 스타일과 일치하는 두 플랫폼에서 다르게 보일 수 있습니다.

예를 들어 XAML에서 볼 수 있듯이 UI는 매우 구조화 된 형태와 언어로 쉽게 표현할 수 있습니다. 시간이 걸리면 "기본"동작을 선택할 수도 있습니다.

따라서 Java 개발자가 Mac 및 Windows에서 기본으로 보이는 응용 프로그램을 얻을 수있는 GUI 프레임 워크를 만들 수 있습니다.

우리는 Swing에 도달합니다. Java를 위해 생성 될 수있는 잠재적 인 무한한 GUI 프레임 워크 중 하나의 GUI 프레임 워크입니다. 위의 프로세스를 따르지 않고 프로그래밍 된 방식으로 작동하며 두 시스템에서 이상하게 보이는 앱을 얻습니다. 스윙 개발자가 선택한 것은 아무도 그렇게하지 않고 그렇게 행동하도록 강요하지 않았다.


2
asker는 이미이 점을 다루었 다. "스윙은 독특한 모양을 갖도록 의도적으로 설계되었을 수있다"
gnat

나는 동의하지만 마이너스 의견을 주셔서 감사합니다 (?)
발렌틴 Kuzub
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.