2012-05-17 11 views
5

Necesito un JTextField con un estilo JLabel (en otras palabras, necesito un JLabel pero quiero poder seleccionar el texto).JTextField con estilo JLabel utilizando 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")); 
... 

Funciona bien en Windows y Mac:

JTextField like a JLabel (Mac)

pero en Ubuntu (GTKLookAndFeel) me sale el siguiente resultado:

JTextField like a JLabel (Ubuntu)

Donde "por" es el JTextField y "Tamaño" es un JLabel

+0

Fuera de interés , ¿qué versiones de Ubuntu/Java estás ejecutando? Acabo de ejecutar este código en mi máquina Ubuntu 12.04 con OpenJDK 1.6.0_24, y funciona como se esperaba; se ve como una etiqueta. – Jamie

+0

@Jamie Ubuntu 10.04 y java 1.6.0.22. ¿Ha establecido UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName())? – Ivan

+0

Ah, eso lo rompe ... Disculpe, pensé que usaría GTK LookAndFeel por defecto, ¡pero aparentemente no! – Jamie

Respuesta

1

Finalmente me dieron el resultado esperado usando JEditorPane en lugar de JTextField:

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

Parece que GTK página de Aspecto no permite un fondo personalizado en el JTextField: http://bugs.sun.com/view_bug.do?bug_id=6531760

2

creo que setBorder(null); para poner a cero por defecto Borders en/vino de UIMananager para GTK L & F, o para ajustar este valor a la UIMananager directamente para JTextField

EDIT:

tiene que cambiar BorderUIResource, de la misma manera como demonstrated here for FontUIResource

Edit2:

enter image description here y a 1,5 seg 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

Ya probé setBorder (null) con los mismos resultados. No entiendo la segunda solución. – Ivan

+0

ejecute [Valores predeterminados de UIManager] (http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/), seleccione GTK y busque valores corregidos para JTextField – mKorbel

+0

Consulte edición en mi respuesta – mKorbel