Java Swing右边框在Microsoft Windows上不起作用

Java Swing右边框在Microsoft Windows上不起作用,java,windows,swing,look-and-feel,jspinner,Java,Windows,Swing,Look And Feel,Jspinner,我无法使标准的BorderFactory.createEmptyBorder在JavaSwing中正常工作 我尝试了一个简单的Java应用程序,它创建了一个微调器视图,并在其周围声明了一个空边框。除微调器视图的右侧外,边框显示在所有位置。但这只发生在Windows上,在OSX上它可以按预期工作 澄清边框的用法:在我的实际应用程序中,我在微调器的外部有一个可见的边框,然后我想将文本居中。我发现createCompoundBorder属性对此非常有用 import javax.swing.*; im

我无法使标准的
BorderFactory.createEmptyBorder
在JavaSwing中正常工作

我尝试了一个简单的Java应用程序,它创建了一个微调器视图,并在其周围声明了一个空边框。除微调器视图的右侧外,边框显示在所有位置。但这只发生在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元素的解决方案。这将是一个简单易行的解决方案(感谢安德鲁·汤普森)。原因是,这只是一个小项目,我陷入了这个错误。在小项目中,我最想要的是干净美观的代码,这意味着这些错误可以通过尝试修复损坏的代码而不是通过解决方法来修复。

看起来JSpinner正在使用自定义布局管理器,并且没有正确处理边框

我修改了你的代码,给按钮边框右边缘的宽度减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并为上/下箭头编写自定义操作。还有一点工作,但它将在所有平台上工作


此外,由于您似乎担心创建额外的组件,因此这将在这方面更加有效。JSpinner本身是一个复杂的组件,JFormattedTextField远比简单的JTextField复杂。

哪个版本的Windows?此代码从未声明名为“fenster”的变量。(可能是JFrame?)对不起。删除一些未使用的注释时意外删除了它。确定。。这条旁白被删除了,也许你可以用更多的信息来编辑这个问题。至于你为什么会排除这种方法。(例如,我们对它的评论集)