2012-05-17 12 views
5

Ich brauche ein JTextField mit einem JLabel-Stil (mit anderen Worten, ich brauche ein JLabel, aber ich möchte in der Lage sein, den Text auszuwählen).JTextField mit JLabel Stil mit GTKLookAndFeel

JTextField value = new JTextField(valueText); 
value.setEditable(false); 
value.setBorder(BorderFactory.createEmptyBorder); 
value.setForeground(UIManager.getColor("Label.foreground"));    
value.setFont(UIManager.getFont("Label.font")); 
value.setBackground(UIManager.getBackground("Label.background")); 
... 

Es funktioniert auf Windows und Mac:

JTextField like a JLabel (Mac)

aber auf Ubuntu (GTKLookAndFeel) ich das nächste Ergebnis:

JTextField like a JLabel (Ubuntu)

Wo "Durch" ist Das JTextField und "Size" ist ein JLabel

+0

Aus Interesse , welche Versionen von Ubuntu/Java liegst du? Ich habe gerade diesen Code meiner Ubuntu 12.04 Maschine mit OpenJDK 1.6.0_24 ausgeführt, und es funktioniert wie erwartet; Es sieht aus wie ein Label. – Jamie

+0

@Jamie Ubuntu 10.04 und Java 1.6.0.22. Haben Sie UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName()) festgelegt? – Ivan

+0

Ah, das macht es kaputt ... Entschuldigung, ich dachte, es würde das GTK LookAndFeel standardmäßig verwenden, aber anscheinend nicht! – Jamie

Antwort

1

Endlich habe ich das erwartete Ergebnis mit JEditorPane statt JTextField:

JEditorPane value = new JEditorPane(); 
value.setText(valueText); 
... 

Es scheint, dass GTK Look and Feel erlaubt es nicht, einen benutzerdefinierten Hintergrund in der JTextField: http://bugs.sun.com/view_bug.do?bug_id=6531760

2

Ich denke, dass setBorder(null); Standard Borders in/aus UIMananager für GTK L & F kam zurückgesetzt, oder diesen Wert zu setzen, um die UIMananager direkt für JTextField

EDIT:

Sie BorderUIResource ändern müssen, die gleiche Art und Weise als demonstrated here for FontUIResource

EDIT2:

enter image description here und in 1,5 sec enter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.Border; 
import javax.swing.border.LineBorder; 
import javax.swing.plaf.BorderUIResource; 

public class SystemFontDisplayer extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JFrame frame = new JFrame("Nimbus UIDeafaults and Font"); 
    private javax.swing.Timer timer = null; 
    private JTextField testTextField = new JTextField("testTextField"); 
    private JButton testButton = new JButton("testButton"); 

    public SystemFontDisplayer() { 
     frame.setLayout(new GridLayout(4, 0, 20, 20)); 
     testTextField.setBorder(null); 
     frame.add(testTextField); 
     frame.add(testButton); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(200, 105); 
     frame.pack(); 
     frame.setVisible(true); 
     start(); 
    } 

    private void start() { 
     timer = new javax.swing.Timer(1500, updateCol()); 
     timer.setRepeats(false); 
     timer.start(); 
    } 

    public Action updateCol() { 
     return new AbstractAction("text load action") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Border border = new LineBorder(Color.red, 2); 
       final BorderUIResource res = new BorderUIResource(border); 
       UIManager.getLookAndFeelDefaults().put("TextField.border", new BorderUIResource(border)); 
       UIManager.getLookAndFeelDefaults().put("Button.border", new BorderUIResource(border)); 
       SwingUtilities.updateComponentTreeUI(frame); 

       /*Border border = new LineBorder(Color.red, 2); 
       try { 
       LookAndFeel lnf = UIManager.getLookAndFeel().getClass().newInstance(); 
       final BorderUIResource res = new BorderUIResource(border); 
       UIDefaults uiDefaults = lnf.getDefaults(); 
       uiDefaults.put("TextField.border", res); 
       uiDefaults.put("Label.border", res); 
       uiDefaults.put("Button.border", res); 
       UIManager.getLookAndFeel().uninitialize(); 
       UIManager.setLookAndFeel(lnf); 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 
       UIDefaults defaults = UIManager.getDefaults(); 
       BorderUIResource res = new BorderUIResource(border); 
       defaults.put("TextField.border", res); 
       defaults.put("Label.border", res); 
       defaults.put("Button.border", res); 
       SwingUtilities.updateComponentTreeUI(frame);*/ 
      } 
     }; 
    } 

    public static void main(String arg[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       SystemFontDisplayer systemFontDisplayer = new SystemFontDisplayer(); 
      } 
     }); 
    } 
} 
+0

Ich habe bereits SetBorder (null) mit den gleichen Ergebnissen versucht. Ich verstehe die zweite Lösung nicht. – Ivan

+0

bitte, um [UIManager Defaults] (http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/), wählen Sie GTK und Suche rellated Werte für JTextField – mKorbel

+0

finden Sie unter Bearbeiten in meiner Antwort – mKorbel

Verwandte Themen