Java 与JLabel一起使用时,JSpinner箭头处于奇数位置

Java 与JLabel一起使用时,JSpinner箭头处于奇数位置,java,swing,format,jspinner,Java,Swing,Format,Jspinner,您好,我创建了一个JFrame,里面有一个JSpinner(如图所示)。现在,BorderLabel显示在Jspinner中(正如它应该显示的那样),但是Jspinner上的箭头作为整个内容的一部分,而不仅仅是Jspinner字段。我想帮助您了解如何将JSpinner箭头放在条上。多谢各位 对于那些要求密码的人 我也想念早些时候的阿贝尔。我是说标题边界 import java.awt.ComponentOrientation; import javax.swing.JFrame; impor

您好,我创建了一个JFrame,里面有一个JSpinner(如图所示)。现在,BorderLabel显示在Jspinner中(正如它应该显示的那样),但是Jspinner上的箭头作为整个内容的一部分,而不仅仅是Jspinner字段。我想帮助您了解如何将JSpinner箭头放在条上。多谢各位

对于那些要求密码的人

我也想念早些时候的阿贝尔。我是说标题边界

import java.awt.ComponentOrientation;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;


public class ex extends JFrame{
    public static void main(String[] args){
        new ex();


    }
    ex(){
        super("test");
        setSize(200,100);
        SpinnerModel sm = new SpinnerNumberModel(3,1,25,1);
        JSpinner shiftIn = new JSpinner(sm);
        JPanel p = new JPanel();
        shiftIn.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
        shiftIn.setBorder(new CompoundBorder(new TitledBorder(new EmptyBorder(0,
                0, 0, 0), "Shift Key"), shiftIn
                .getBorder()));
        p.add(shiftIn);
        add(p);
        setVisible(true);
    }
}

这不是那种有标题的边框的东西

使用
JLabel
并将其放在
BorderLayout
PAGE\u START
中,将
JSpinner
放在
PAGE\u END
中。添加当前添加微调器的容器(面板)。(然后为标签添加助记符,并使其成为微调器的“标签”。)


这是如何在另一个布局中使用该想法(本例中为
GridLayout

import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.*;
公共类ex扩展了JFrame{
公共静态void main(字符串[]args){
新ex();
}
ex(){
超级(“测试”);
//想象一下,这实际上是在使用GridBagLayout
JPanel ui=newjpanel(新的网格布局(0,3,4,4));
ui.setboorder(新的空订单(4,4,4,4));
喷丝头型号sm=新喷丝头型号(3,1,25,1);
JSpinner-shiftIn=新的JSpinner(sm);
JLabel l=新JLabel(“换档键”);
JPanel p=newjpanel(newborderlayout());
p、 添加(l,边框布局。页面开始);
p、 添加(shiftIn,BorderLayout.PAGE_END);
添加(用户界面);

对于(int ii=0;ii您似乎因为弄乱了JSpinner的边框而面临风险。我自己会将JSpinner包装在一个JPanel中,然后给包装器JPanel所需的边框。例如:

import java.awt.BorderLayout;
import java.awt.ComponentOrientation;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;

@SuppressWarnings("serial")
public class Ex extends JFrame {
   public static void main(String[] args) {
      new Ex();

   }

   Ex() {
      super("test");
      setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      SpinnerModel sm = new SpinnerNumberModel(3, 1, 25, 1);
      JSpinner shiftIn = new JSpinner(sm);
      JPanel spinnerWrapper = new JPanel(new BorderLayout());
      spinnerWrapper.setBorder(BorderFactory.createTitledBorder(
            BorderFactory.createEmptyBorder(0, 0, 0, 0), "Shift Key"));
      spinnerWrapper.add(shiftIn);
      shiftIn.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
      add(spinnerWrapper);
      pack(); 
      setVisible(true);
   }
}

当询问有关组件定位和布局的问题时,您需要发布相关代码,最好是一个。否则问题会出现“请猜为什么我没有向您展示的代码不起作用”的问题,这些问题很难回答。JLabel显示在Jspinner中(应该是这样的)-应该吗?听起来已经错了…请阅读或重新阅读。您将希望创建并发布一个小程序,该程序没有任何功能,但可以显示您的GUI并向我们显示您的问题。它应该小、简单,并且可以为我们编译和运行,而不需要外部图像、文件、数据库等。此外,您不希望设置为首选任何东西的红色大小,除非您正在更改外观,否则几乎不需要在Swing GUI中调用
updateUI()
。@hoverCraftfullOfels是的。您的方法是有效的,但如果要标记控件,我仍然更喜欢使用标签。可能对一组控件使用有标题的边框(如中所示)我使用的代码是一个更大程序的一部分。面板上也有两个按钮,当我在
PAGE\u START
添加JLabel时,标签就在JSpinner的左边。我也在使用
GridBagLayout
来布局我的swing组件,但我不确定如何很好地使用GridBagLayout。@Meeesh“但是我…”。忘了完成那个评论了吗?我不得不说,到那个时候它没有多大意义。为了获得进一步的帮助,最好发布一个(最小完整的可验证示例)或(简短的、自包含的、正确的示例)这个效果。“另外,我正在使用GridBagLayout来布局我的swing组件”停止思考“使用X布局”。所有GUI(即使我们使用单个布局)由多个布局组成。这就是我在上面的评论中所说的使用
JPanel
BorderLayout
作为标签和微调器的意思。如果你在GBL放置微调器的地方添加面板,它将像广告一样工作。我只能猜测你试图在BGL的
页面上添加标签,这就是全部不是我的意思。好吧,看起来很好,但是我的jpanel也包含多个按钮。我应该只创建一个单独的jpanel还是有更好的方法。“我应该只创建一个单独的jpanel…”是的!为了复杂的布局需要,将布局相互嵌套。
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class ex extends JFrame {

    public static void main(String[] args) {
        new ex();
    }

    ex() {
        super("test");
        // imagine this is actually using GridBagLayout
        JPanel ui = new JPanel(new GridLayout(0, 3,4,4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));
        SpinnerModel sm = new SpinnerNumberModel(3, 1, 25, 1);
        JSpinner shiftIn = new JSpinner(sm);
        JLabel l = new JLabel("Shift Key"); 
        JPanel p = new JPanel(new BorderLayout());
        p.add(l, BorderLayout.PAGE_START);
        p.add(shiftIn, BorderLayout.PAGE_END);
        add(ui);

        for (int ii=0; ii<9; ii++) {
            if (ii==4) {
                ui.add(p);
            } else {
                ui.add(new JButton("Button"));
            }
        }

        pack();
        setVisible(true);
    }
}
import java.awt.BorderLayout;
import java.awt.ComponentOrientation;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;

@SuppressWarnings("serial")
public class Ex extends JFrame {
   public static void main(String[] args) {
      new Ex();

   }

   Ex() {
      super("test");
      setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      SpinnerModel sm = new SpinnerNumberModel(3, 1, 25, 1);
      JSpinner shiftIn = new JSpinner(sm);
      JPanel spinnerWrapper = new JPanel(new BorderLayout());
      spinnerWrapper.setBorder(BorderFactory.createTitledBorder(
            BorderFactory.createEmptyBorder(0, 0, 0, 0), "Shift Key"));
      spinnerWrapper.add(shiftIn);
      shiftIn.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
      add(spinnerWrapper);
      pack(); 
      setVisible(true);
   }
}