我无法在Java Swing中正常使用标准BorderFactory.createEmptyBorder

我使用一个简单的Java应用程序进行了尝试,该应用程序创建了Spinner View并在其周围声明了一个空边框。除了微调器 View 的右侧以外,其他任何地方都显示边框。但这仅发生在Windows中,在OSX上可以正常工作。

为了澄清边框的使用:在我的实际应用程序中,微调器的外部有一个可见的边框,然后我想在其中居中放置文本。我发现createCompoundBorder属性对此非常有用。

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

class HelloWorldSwing {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(
                UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {}

        Runnable guiCreator = new Runnable() {
            public void run() {
                JFrame fenster = new JFrame("Hallo Welt mit Swing");
                fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                SpinnerNumberModel model = new SpinnerNumberModel(1,1,9,1);
                JSpinner spinner = new JSpinner(model);

                JFormattedTextField textField = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
                textField.setOpaque(true);
                // textField.setBackground(Color.);

                spinner.setBorder(BorderFactory.createEmptyBorder(50, 100, 50, 100));

                spinner.setUI(new javax.swing.plaf.basic.BasicSpinnerUI() {
                    protected Component createNextButton() {
                        Component c = new JButton();
                        c.setPreferredSize(new Dimension(0, 0));
                        c.setFocusable(false);
                        return c;
                    }

                    protected Component createPreviousButton() {
                        Component c = new JButton();
                        c.setPreferredSize(new Dimension(0, 0));
                        c.setFocusable(false);
                        return c;
                    }
                });
                spinner.setBackground(Color.LIGHT_GRAY);
                fenster.add(spinner);

                fenster.setSize(300, 200);
                fenster.setVisible(true);
            }
        };

        SwingUtilities.invokeLater(guiCreator);
    }
}

编辑:
我不想找到实现另一个UI元素的解决方案。这将是一个简单的解决方案(感谢Andrew Thompson)。原因是这只是我遇到此错误的一个小项目。在小型项目中,我主要想要一个干净且美观的代码,这意味着可以通过尝试修复损坏的代码而不是通过变通办法来修复此类错误。

提前致谢

最佳答案

看起来JSpinner正在使用自定义布局管理器,但未正确处理Border。

我修改了代码,使按钮的边框右侧边缘的宽度减1。我猜布局管理器在文本字段的边缘和按钮之间留了1个像素的间隙。

似乎可以在Windows上运行,但是可能会使OSX困惑?

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

class HelloWorldSwing {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(
                UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {}

        Runnable guiCreator = new Runnable() {
            public void run() {
                JFrame fenster = new JFrame("Hallo Welt mit Swing");
                fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                SpinnerNumberModel model = new SpinnerNumberModel(1,1,9,1);
                JSpinner spinner = new JSpinner(model);

                JFormattedTextField textField = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
                textField.setOpaque(true);
                // textField.setBackground(Color.);

                spinner.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 0));

                spinner.setUI(new javax.swing.plaf.basic.BasicSpinnerUI() {
                    protected Component createNextButton() {
                        Component c = new JButton();
                        c.setPreferredSize(new Dimension(9, 0));
                        c.setVisible(false);
                        return c;
                    }

                    protected Component createPreviousButton() {
                        Component c = new JButton();
                        c.setPreferredSize(new Dimension(9, 0));
                         c.setVisible(false);
                        return c;
                    }
                });
                spinner.setBackground(Color.LIGHT_GRAY);
                fenster.setLayout( new FlowLayout() );
                fenster.add(spinner);

                fenster.setSize(300, 200);
                fenster.setVisible(true);
            }
        };

        SwingUtilities.invokeLater(guiCreator);
    }
}

另一种解决方案是不使用JSpinner。您可以轻松地使用JTextField并为上/下箭头编写自定义Action。还有更多工作,但是它将在所有平台上工作。

另外,由于您似乎担心创建额外的组件,因此在这方面效率会大大提高。 JSpinner本身就是一个复杂的组件,而JFormattedTextField比简单的JTextField复杂得多。

关于java - Java Swing右边框在Microsoft Windows上不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37707039/

10-11 00:52
查看更多