Java JTextField带有JLabel样式,使用GTKLookAndFeel

Java JTextField带有JLabel样式,使用GTKLookAndFeel,java,swing,ubuntu,look-and-feel,uimanager,Java,Swing,Ubuntu,Look And Feel,Uimanager,我需要一个JTextField和JLabel样式(换句话说,我需要一个JLabel,但我希望能够选择文本) 它在Windows和Mac上运行良好: 但在Ubuntu(GTKLookAndFeel)上,我得到了下一个结果: 其中“By”是JTextField,“Size”是JLabel我认为setboorder(null)用于重置GTK L&F的UIMananager中/来自UIMananager的默认Borders,或直接为JTextField将此值设置为UIMananager 编辑: 您必

我需要一个JTextField和JLabel样式(换句话说,我需要一个JLabel,但我希望能够选择文本)

它在Windows和Mac上运行良好:

但在Ubuntu(GTKLookAndFeel)上,我得到了下一个结果:


其中“By”是JTextField,“Size”是JLabel

我认为
setboorder(null)
用于重置GTK L&F的
UIMananager中/来自
UIMananager的默认
Borders
,或直接为
JTextField将此值设置为
UIMananager

编辑:

您必须更改BorderUIResource,方法与

编辑2:

在1.5秒

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();
            }
        });
    }
}

最后,我使用JEditorPane而不是JTextField获得了预期的结果:

JEditorPane value = new JEditorPane();
value.setText(valueText);
...  
GTK外观似乎不允许在JTextField中使用自定义背景:

我已经尝试了setboorder(null)并得到了相同的结果。我不理解第二个解决方案。请运行,选择GTK并搜索JTextField的相关值。我尝试使用UIManager.getLookAndFeelDefaults().put(“TextField.border”,new BorderUIResource(new myBorder());但它不起作用。是的,我知道,但如果添加UIManager.setLookAndFeel(“com.sun.java.swing.plaf.GTK.GTKLookAndFeel”)在你的代码中,它不是以同样的方式工作的。@Ivan我仍然认为UIManager和BasicxxUI对所有本机操作系统都是以同样的方式工作的,我不认为setBorder不起作用,也不认为将值放入感兴趣的UIManagerRout,你正在运行哪个版本的Ubuntu/Java?我刚刚在我的Ubuntu 12.04机器上运行了这段代码使用OpenJDK 1.6.024,它工作正常;它看起来就像一个标签。@Jamie Ubuntu10.04和java 1.6.0.22。您是否设置了UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())?啊,这确实打破了它……对不起,我以为默认情况下它会使用GTK LookAndFeel,但显然不是!
JEditorPane value = new JEditorPane();
value.setText(valueText);
...