2014-06-17 10 views
6

Wenn ich eine JComboBox unter Windows 7 verwenden, haben die vier Ecken jeweils ein Pixel, das nicht mit der Hintergrundfarbe der übergeordneten Komponente übereinstimmt.JComboBox unter Windows 7 hat Renderartefakte

In Windows 8 tritt dieses Problem nicht auf (obwohl dies daran liegen könnte, dass die JComboBox in Windows 8 als perfektes Rechteck dargestellt wird). Es passiert auch unter OS X nicht.

Was kann ich tun, damit die Eckpixel die Hintergrundfarbe der Elternkomponente durchlassen?

Hier ist ein Bild, das das Problem:

enter image description here

Hier ist eine in sich geschlossene Codebeispiel Ich verwende:

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

Ich kenne dieses Problem ... aber ich dachte, es wäre normal. Vielleicht müssen Sie alle Hintergrundfarben der Komponenten (einschließlich der Combobox) auf die gleiche Farbe einstellen. – Rubinum

+0

Was "UIManager" [defaults] (http://stackoverflow.com/a/1197350/230513) in "WindowsLookAndFeel" haben Sie versucht? – trashgod

+1

@trashgod leider dies ist Standard in Win7, nur um Grenzen zu überschreiben, häufiges Problem von Win Vista + Aero – mKorbel

Antwort

3

Versuchen Sie, die Grenze zu entfernen ...

comboBox.setBorder(null); 

enter image description here

Die nächste Wahl wäre ein spezielles Aussehen zu entwerfen und zu delegieren fühlen, das erreicht, was Sie auf Windows ... wollten

Zum Beispiel ...

public static class MyComboBoxUI extends WindowsComboBoxUI { 

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

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

} 

Und dann installieren Sie es mit ...

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

Dies bedeutet, dass Sie Sie

Oder Sie cou schaffen nicht die Grenzen von jedem Kombinationsfeld entfernen müssen, ld einfach überschreiben die Standard-Eigenschaft border im UIManager ...

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

So oder so, werden alle Kombinationsfelder bewirken erstellt, nachdem Sie es anwenden ...

+0

Ändern der UI-Eigenschaft ComboBox.border hat perfekt funktioniert. Vielen Dank. –

-1

Das erste, was ich versuchen würde, ist setOpaque (false) auf der JComboBox.

Auch sollten Sie das WindowLookAndFeel nicht direkt festlegen. Stattdessen setzen die Systemvorbelegung L & F:

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

die immer die Standard-Look OS gesetzt wird und das Gefühl, unabhängig davon, welches Betriebssystem Sie laufen auf.

+0

Keine dieser Vorschläge löst das Problem. –

Verwandte Themen