2015-06-11 31 views
6

Attualmente sto lavorando su una piccola applicazione Java, che include GUI Swing. Sul mio PC di sviluppo tutto sembra a posto, ma quando lo eseguo su MS Surface, alcune icone sembrano troppo grandi per i componenti (o i componenti troppo piccoli per le icone).Ridimensionamento dell'interfaccia utente di Bad Swing ad alta risoluzione (superficie MS)

Ecco cosa intendo:

scaling issue

ricerca Google mi ha portato a concludere che questo è dovuto al alta risoluzione di superficie e zoom di Win8 di lasciare alcuni elementi appaiono un po 'più grande. Quindi ho ripristinato lo zoom al 100% e in effetti ho corretto il ridimensionamento errato.

Sfortunatamente, questo non risolve il problema. Tutto è troppo piccolo senza lo zoom, quindi preferisco non disattivarlo. Ma c'è un modo intelligente per risolvere questo? Posso semplicemente "svalutare" le icone del mio programma o di Java? Idealmente, mi piacerebbe anche l'upscaling dell'intero frame, perché tutto è piuttosto piccolo.

Edit: ovviamente, ho anche provato a ridimensionare l'attuale JFrame ma non ha alcun effetto sulle dimensioni della finestra di dialogo. Sto chiamando la finestra di dialogo

JOptionPane.showMessageDialog(frame, msg, "Information", JOptionPane.INFORMATION_MESSAGE); 

a proposito.

+0

Oracle non è in grado di aggiungere alta risoluzione a Swing. Puoi provare JavaFX o [Apache Pivot] (http://pivot.apache.org/). –

+0

1. quelle icone (distribuite in pacchetti Java, intiliate in UIManager) hanno dimensioni fisse in pixel, 2. non reagiscono alle dimensioni dell'icona in ambiente di visualizzazione Win8/8.1, 3. forse problema specifico con Surface, [è possibile test] (http://stackoverflow.com/q/8575641/714968) – mKorbel

risposta

2

Ecco una soluzione sgradevole, veloce e veloce che bloccherà il brutto ritaglio ridimensionando le icone di Swing all'80%.

In main, aggiungere questo:

String[] iconOpts = {"OptionPane.errorIcon", 
    "OptionPane.informationIcon", 
    "OptionPane.warningIcon", 
    "OptionPane.questionIcon"}; 
for (String key : iconOpts) { 
    ImageIcon icon = (ImageIcon) UIManager.get(key); 
    Image img = icon.getImage(); 
    BufferedImage bi = new BufferedImage(
      img.getWidth(null), img.getHeight(null), 
      BufferedImage.TYPE_INT_ARGB); 
    java.awt.Graphics g = bi.createGraphics(); 
    g.drawImage(img, 0, 0, 
      (int) (img.getWidth(null) * 0.8), 
      (int) (img.getHeight(null) * 0.8), null); 
    ImageIcon newIcon = new ImageIcon(bi); 
    UIManager.put(key, newIcon); 
} 

Si potrebbe voler controllare prima se questo è effettivamente necessaria - Windows 8/10 default è 125%, ma alcune persone si passa di nuovo al 100%. Non ho trovato un modo elegante per fare questo, ma qualcosa in questo senso vi darà un'idea:

java.awt.Font font = (java.awt.Font) UIManager.get("Label.font"); 
if (font.getSize() != 11) { 
    //resize icons in here 
} 
+0

Grazie per il suggerimento. Ma ha anche funzionato impostando la scala su 1.0, intendo invece di usare (int) (img.getWidth (null) * 0.8), (int) (img.getHeight (null) * 0.8) Se si utilizzare (int) (img.getWidth (null) * 1.0), (int) (img.getHeight (null) * 1.0) Quindi, non sembra essere correlato alla scala, ma all'origine correlata .. Non lo so esattamente – dannyxyz22

1

maggior sguardo swing & Feels non supportano alta DPI a tutti, nemmeno Nimbus anche se è dovrebbe essere scalabile. Ho trovato alcuni vecchi post del blog che dicevano che Nimbus potrebbe alla fine offrire un ridimensionamento DPI elevato, ma a quanto pare non è mai successo.

L'unica eccezione è System LAF ma il suo carattere predefinito è ~ 10% più piccolo delle dimensioni effettive del carattere di sistema, a tutte le impostazioni DPI. Inoltre, il sistema deve essere selezionato esplicitamente come descritto qui: http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

Non esiste un singolo fattore di scala che è possibile impostare in Swing. Il LAF specifico deve fornire il codice per gestire il ridimensionamento. Quindi il meglio che puoi fare è selezionare Sistema e spero che sia abbastanza buono.

Tuttavia, JavaFX funziona correttamente e automaticamente in scala fino al 150% sul mio sistema. Se possibile, ti suggerisco di utilizzare JavaFX per creare la GUI.

modifica: Ho creato un paio di piccoli programmi di test e preso schermate di confronto per vari framework GUI, temi Swing e impostazioni DPI. Questo potrebbe essere informativo per persone che leggono questa domanda: http://kynosarges.org/GuiDpiScaling.html

0

in base alla risposta del rosa ho creato una breve variante meno prolissa:

String[] iconOpts = {"OptionPane.errorIcon", 
    "OptionPane.informationIcon", 
    "OptionPane.warningIcon", 
    "OptionPane.questionIcon"}; 
for (String key : iconOpts) { 
    ImageIcon icon = (ImageIcon) UIManager.get(key); 
    Image img = icon.getImage(); 
    ImageIcon newIcon = new ImageIcon(img.getScaledInstance(img.getWidth(null), 
     img.getHeight(null), 0)); 
    UIManager.put(key, newIcon); 
} 

P.S.: A causa del sistema di reputazione non ero in grado di commentare il post di Rosa.