2014-06-17 11 views
6

Quando utilizzo un JComboBox su Windows 7, i quattro angoli hanno ciascuno un pixel che non corrisponde al colore di sfondo del componente principale.JComboBox su Windows 7 presenta artefatti di rendering

In Windows 8 questo problema non si verifica (anche se ciò potrebbe essere dovuto al fatto che in Windows 8, JComboBox è reso come un rettangolo perfetto). Né accade su OS X.

Cosa posso fare per fare in modo che i pixel dell'angolo lascino passare il colore di sfondo del componente principale?

Ecco un'immagine che mostra il problema:

enter image description here

Ecco un esempio di codice autonomo che sto utilizzando:

import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; 

import javax.swing.*; 
import java.awt.*; 

public class Main { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(new WindowsLookAndFeel()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       JPanel contentPane = new JPanel(); 
       contentPane.setBackground(Color.WHITE); 

       JComboBox<String> comboBox = new JComboBox<String>(new String[]{"One", "Two"}); 
       contentPane.add(comboBox); 

       JFrame frame = new JFrame("JComboBox Test"); 
       frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       frame.setContentPane(contentPane); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

conosco questo problema ... ma ho pensato che sarebbe stato normale. forse devi impostare tutti i colori di sfondo dei componenti (incluso il combobox) sullo stesso colore. – Rubinum

+0

Cosa si è provato con 'UIManager' [predefinito] (http://stackoverflow.com/a/1197350/230513) in' WindowsLookAndFeel'? – trashgod

+1

@trashgod purtroppo questo è di default in Win7, solo per sovrascrivere i Bordi, problema comune da Win Vista + Aero – mKorbel

risposta

3

Provare a rimuovere il confine ...

comboBox.setBorder(null); 

enter image description here

La scelta successiva sarebbe quella di progettare uno sguardo specializzato e sentirsi delegato che raggiunto ciò che si voleva su Windows ...

Per esempio ...

public static class MyComboBoxUI extends WindowsComboBoxUI { 

    @Override 
    protected void installDefaults() { 
     super.installDefaults(); 
     LookAndFeel.uninstallBorder(comboBox); 
    } 

    public static ComponentUI createUI(JComponent c) { 
     return new MyComboBoxUI(); 
    } 

} 

E poi installarlo utilizzando ...

UIManager.put("ComboBoxUI", MyComboBoxUI.class.getName()); 

Ciò significa che non sarà necessario per rimuovere i bordi da ogni casella combinata si crea

Oppure, si cou ld semplicemente ignorare la proprietà border default nella UIManager ...

UIManager.put("ComboBox.border", new EmptyBorder(0, 0, 0, 0)); 

In entrambi i casi, si effettuerà tutte le caselle combinate create dopo averlo applicato ...

+0

Cambiare la proprietà dell'interfaccia utente ComboBox.border ha funzionato perfettamente. Grazie. –

-1

prima cosa che vorrei provare è setOpaque (false) su JComboBox.

Inoltre, non impostare direttamente WindowLookAndFeel. Invece impostare il sistema predefinito L & F:

// force platform native look & feel 
try { 
    final String className = UIManager.getSystemLookAndFeelClassName(); 
    UIManager.setLookAndFeel(className); 
} catch (final Exception e) { 
    // ignore 
} 

che sarà sempre impostato aspetto di default del sistema operativo e si sentono, indipendentemente da quale sistema operativo si sta eseguendo su.

+0

Nessuno di questi suggerimenti risolve il problema. –