Como executo aplicativos Java redimensionados em uma tela de alto DPI?

73

Estou tentando executar um aplicativo Java (arquivo JAR) em uma tela de alto DPI no Windows 10. O aplicativo usa o Swing e, portanto, não reconhece o DPI. Normalmente, quando executo um aplicativo que não reconhece DPI, o Windows o dimensionará para mim, embora embaçado. Mas, por algum motivo, não está dimensionando o aplicativo Java; Acabei de receber uma pequena janela no canto com texto impossível de ler. Como executo um aplicativo Java com a escala de alto DPI (embaçada) do Windows?

Jeff E
fonte
É o seu aplicativo e você controla as fontes / objetos, ou é um aplicativo herdado que agora é imutável?
harrymc
3
Não é minha aplicação; nenhum controle sobre a fonte.
Jeff E
Más notícias, pode ser necessário diminuir o seu DPI para executar esse aplicativo. Aqui estão alguns recursos com hacks que podem ajudar: Corrija fontes borradas no Windows 10 , Configurações de DPI no Windows 10 , Windows 10 DPI borradas . Crie pelo menos um backup do ponto de restauração do sistema antes de testá-los, apenas por precaução. A solução alternativa poderia ser a de voltar para o Windows 7.
harrymc
4
@harrymc Como um dos itens acima ajudaria? O problema não é de fontes borradas ou que se recusa a executar, o problema é que tudo é minúsculo . A renderização de fonte "embaçada" é o que eu quero alcançar e, como eu entendi a pergunta do OP, elas também o fazem. Definir a escala de DPI para 100% tornaria o sistema inteiro minúsculo; definir a resolução da tela para uma não nativa faria tudo parecer embaçado. (Ok, não blurrier do que em uma tela 1080p para mim, mas ainda assim.)
millimoose
1
@harrymc E enquanto o último pode tornar o aplicativo utilizável, tenho certeza de que você entende por que responder "como faço para o X funcionar em uma tela de 2160p?" com "usar uma tela pior" é meio que errado.
millimoose

Respostas:

36

O problema aqui parece ser que o Swing afirma, por padrão, que reconhece o DPI, para que o Windows não o dimensione. Use essa opção para desativar esse comportamento e o Windows começará a dimensionar seu aplicativo swing:

-Dsun.java2d.dpiaware=false

[EDIT: Infelizmente, esse sinalizador não parece mais funcionar no Java 8, eu estava testando no Java 6. Parece que esse é um problema conhecido .]

[EDIT 2: Você pode modificar uma instalação do Java 8 para funcionar corretamente, usando um programa para modificar os manifestos do EXE. Alterei a configuração de true para false nos manifestos dentro de java.exe e javaw.exe e agora meus programas Swing são dimensionados corretamente no Windows 10 dpi alto. Eu usei o Resource Tuner para isso.]

[Edit 3] Basta usar Java 9

CarlG
fonte
Você pode elaborar a edição # 2? Qual configuração você modificou no manifesto exatamente?
precisa
No XML do manifesto, é o sinalizador <dpiAware> em <asmv3: application> <asmv3: windowsSettings>
CarlG 17/16
Essa é a questão. Eu vi esse sinalizador e o configurei false, mas o aplicativo (JNLP / WebStart) não foi dimensionado corretamente de qualquer maneira. Você consegue pensar em uma maneira simples de verificar se isso funciona ou não, por exemplo, um aplicativo de teste que você conhece que responde a essa configuração?
amigos estão
O Webstart é particularmente exigente, pois pode ser difícil identificar exatamente qual executável em qual distro você instalou e que acaba usando. Como verificação cruzada, eu tentaria iniciar seu aplicativo diretamente com java.exe ou javaw.exe e pular o JWS para ver se há alguma diferença.
CarlG
4
Isso está em algum lugar entre cômico e ridículo. A estrutura relata incorretamente seus recursos e a opção que corrigiu o erro é removida. A única solução alternativa? Para usuários finais comprarem uma ferramenta de terceiros. E as pessoas se perguntam por que o Java tem uma reputação tão ruim.
Básico
66

Acabei de encontrar uma solução fácil na minha máquina Windows 10:

  1. Encontre java.exevocê instalado.
  2. Clique com o botão direito -> Properties
  3. Vá para a Compatibilityguia
  4. Verifica Override high DPI scaling behavior.
  5. Escolha SystemparaScaling performed by:
Elderry
fonte
4
Melhor solução - Eu tive esse problema ao executar um arquivo .jnlp, então tive que alterar o "C: \ Arquivos de Programas \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe", mas isso funcionou como um encanto.
Dror Harari
Para mim, era a versão do JDK. Encontrado com o botão direito e abrir as opções do gerenciador de tarefas no Windows 10.
Brian Knoblauch
3
No Windows 10, executando lançadores de Minecraft baseados em Java, tive que alterar todas as versões Java instaladas no meu sistema para que funcionasse (java.exe e javaw.exe).
22617 cyberbit
5
Eu usei uma variante menos intrusiva. Criei um atalho para o comando java -jar myJarFile.jare executei as etapas 2 a 5 nesse atalho (Windows 10, Java 8).
Julian Kronegg
1
Para mim, foi #javaw.exe
masterxilo
13

Se você se deparou com essa pergunta, mas está realmente procurando uma solução que funcione no Linux, isso é para você.

Se você pode adicionar parâmetros ao javabinário que inicia o aplicativo, pode usar a opção -Dpara passar um valor para a sun.java2d.uiScalepropriedade para especificar um fator de escala para Java2D. Isso dimensionará seu aplicativo. O valor do fator de escala é um dobro. Certifique-se de passar essa opção para o javapróprio binário, não para o aplicativo Java iniciado.

Exemplo: inicie o NearInfinity.jar com um fator de escala da interface do usuário de 2,5

java -Dsun.java2d.uiScale=2.5 -jar ~/jars/NearInfinity.jar

Eu achei este artigo bastante útil em geral para executar o Linux em sistemas HiDPI, e algumas das coisas também podem funcionar no Windows: https://wiki.archlinux.org/index.php/HiDPI

Christian Hujer
fonte
Isso é bom, embora eu gostaria de obter um dimensionamento de 1 para JFrames e o sistema para JOptionPanes.
NateS 11/08
1
Não funciona para mim.
Atte Juvonen 26/09
@AtteJuvonen Em vez de dizer "meu carro não funciona", quando não funciona para você, por que você não publica uma nova pergunta descrevendo o que tentou, qual foi o resultado esperado, qual foi o real resultado, qual linha de comando você usou e quais, se houver alguma, mensagens de erro que você recebeu?
Christian Hujer 27/09/18
@ChristianHujer Tentei iniciar meu aplicativo Java Swing com esse parâmetro (a mesma linha de comando da sua resposta, exceto que o caminho para o jar é diferente) e o aplicativo foi iniciado sem redimensionar.
Atte Juvonen
Desculpe se pareço rude, apenas frustrado quando nada funciona. FWIW: Eu postei uma nova pergunta sobre isso e também postarei uma recompensa assim que o site permitir.
Atte Juvonen
10

Solução: execute-o no JRE 9.

Isso ocorre porque o tempo de execução Java declarou-se "sensível a DPI", mas na verdade não o suportava para AWT e Swing. Os aplicativos Java foram dimensionados e renderizados com base em pixels, em vez de serem adequadamente dimensionados, incluindo telas HiDPI. De qualquer forma, isso foi resolvido recentemente. Veja o problema JEP 263: HiDPI Graphics no Windows e Linux e a atualização .

Portanto, aumentar o tamanho da fonte não funciona (porque não aumenta o restante das coisas); o argumento jvm -Dsun.java2d.dpiaware=falsenão funciona (porque realmente não é suportado); e o arquivo de manifesto + edição do registro (para Windows) simplesmente não funciona.

Em seguida, é necessário executá-lo no JRE 9, porque ele realmente suporta esse recurso.

Sergio Muriel
fonte
Ficarei muito animado se o Java9 corrigir isso.
Music2myear
3
Isso não indica que você precisa recompilar o código. Simplesmente executando o mesmo Java 8- aplicação em Java com mais de 9 não vai mudar o comportamento
Ramhound
A execução de programas HiDPI no Java 9 resolve muitos problemas. goo.gl/3zmL7b
Gernot Krost
3
@ Ramhound Você não precisa recompilar. Acabei de criar um jar com o JDK8 para Java 8 que substitui o método paint () do JPanel em tela cheia em um sistema W10 com tela 4K e configuração de escala de 200%. Execute com o java.exe do Java 8, o objeto Graphics2D fornecido para o método tem uma escala de 1 e o JPanel tem uma getWidth / height de 3840x2160. Execute com o java.exe do Java 9, a escala é 2 e a largura / altura é 1920x1080.
Dreamspace President
1
Você encontrará um novo método no Java 9: ​​Screen.getPrimary (). GetOutputScaleX (); o que realmente funciona. (A outra opção é usar o tamanho da tela JavaFX, (Screen.getPrimary (). GetVisualBounds ()) que funciona e dividi-lo em Toolkit.getDefaultToolkit (). GetScreenSize (), você descobrirá que pode adivinhar no DPI selecionado: 200% resultará em cerca de 2,0, mas infelizmente 125% ainda resultará em uma porcentagem de escala 1.0.No entanto, mesmo depois de mudar para Java9: encontrei minhas GUIs totalmente destruídas à medida que os botões se expandiam, mas algumas das constantes (utilizado para lacunas, estofamento etc) não..
wax_lyrical
4

Para forçar todos os executáveis ​​java a ter "propriedades> compatibilidade> modo de escala de dpi" definido como "Sistema", em um PowerShell de administrador (win-x, a), execute:

$javaexes = (Get-ChildItem -path "$env:ProgramFiles\Java","${env:ProgramFiles(x86)}\java" -filter java?.exe -recurse  | Where-Object {$_.Name -match "java(|w).exe"} ).fullname

$javaexes | foreach {REG ADD "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"  /V $_ /T REG_SZ /D "~ DPIUNAWARE" /F}

desfazer:

$javaexes | foreach {REG delete "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"  /V $_ /f}

Em vez de HKCU, você poderia usar o HKLM, mas não poderá mais alterar manualmente a configuração de escala de dpi na caixa de diálogo Propriedades> Compatibilidade dos arquivos java * .exe.

masterxilo
fonte
2

Você precisa definir PreferExternalManifest no regedit e criar manifestos personalizados para java.exe e javaw.exe, conforme fornecido na resposta a seguir stackoverflow https://stackoverflow.com/a/39372897

droidlabel
fonte
2
Boas notícias, a atualização Fall Creators permite alterar o comportamento da escala clicando com o botão direito do mouse no item, selecionando propriedades e depois na guia compatibilidade. A criação de um manifesto externo personalizado não é mais necessária - o que é bom.
Richard
2

Obrigado por Kenneth. Acho que C:\Program Files (x86)\Java\jre\bin\java.exe, em seguida, right click -> properties -> compatibility tab -> "override high DPI scaling behavior"e selecione System, então ele também works.I tentou a mesma maneira de mudar o javaw.exe'compatibilidade s, ele também funciona.

PS: Eu corro burpsuite.jarno win10 1703 usando esse método.

xile
fonte
0

A solução de Elderry é boa, mas e se você quiser executar um arquivo jar no Windows e ele não tiver opções de compatibilidade?

Vá para C: \ Arquivos de Programas (x86) \ Java \ jre \ bin e localize javaw.exe. Clique com o botão direito do mouse, propriedades, guia compatibilidade, marque "substituir o comportamento de escala de DPI alto" e selecione "Sistema" (observe que "Sistema aprimorado" não funcionou para mim).

Agora, as janelas dos arquivos jar devem ser dimensionadas corretamente com texto legível. Caso contrário, isso pode significar que o Windows não vincula os arquivos do tipo jar ao javaw.eve, como deveria. Uma correção de terceiros está disponível em: https://johann.loefflmann.net/en/software/jarfix/index.html

Kenneth
fonte
0

Experimente o Java 10.

Eu descobri que -Dsun.java2d.dpiaware = false não funciona no Java 9 ou 10. Também para Java 8 e 9, meu aplicativo Swing é pequeno, mas o Java 10 é dimensionado corretamente no Windows!

portanto, para um aplicativo que você pode executar a partir de um arquivo bat como: java -jar xxx.jar

Acabei de adicionar JAVA_HOME = .... \ java_10 e PATH =% JAVA_HOME% \ bin;% PATH% no arquivo bat.

java -jar xxx.jar

Stan Towianski
fonte
-1

Tentei a maioria dessas soluções, mas a que funcionou para mim foi definir o modo de compatibilidade do sistema nos arquivos que encontrei no seguinte local:

C:\Program Files (x86)\Common Files\Oracle\Java\javapath
Ryan Reynolds
fonte
1
Bem-vindo ao Super Usuário! Por favor, não adicione "obrigado" ou "este funcionou para mim" como respostas. Invista algum tempo no site e você obterá privilégios suficientes para aprovar as respostas que desejar, que é a maneira do Superusuário de dizer obrigado.
bertieb
-3

Eu era capaz de obter dpi sensíveis quando executado usando o prompt de comando, como:

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
user3301455
fonte