JSpinner Arrows в странном положении при использовании с JLabel

Привет Итак, я создал JFrame с JSpinner внутри (как вы можете видеть на картинке). Прямо сейчас BorderLabel отображается в Jspinner (как и должно быть), но стрелки на JSpinner присутствуют как часть всего объекта, а не только поле JSpinner. Я хотел бы помочь узнать, как разместить стрелки JSpinner на панели. Спасибо.

введите здесь описание изображения

Для вас, кто просил код,

Также я скучаю по заявленному ранее JLabel. Я имел в виду TitledBorder

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

person Meeesh    schedule 10.12.2014    source источник
comment
Задавая вопросы о расположении и расположении компонентов, вам необходимо опубликовать соответствующий код, предпочтительно mcve. В противном случае возникает вопрос: пожалуйста, угадайте, почему код, который я вам не показываю, не работает, вопросы, на которые очень трудно ответить.   -  person Hovercraft Full Of Eels    schedule 10.12.2014
comment
JLabel отображается в Jspinner (как и должно быть) - Должен ли? Это звучит уже неправильно...   -  person MadProgrammer    schedule 10.12.2014
comment
Прочтите или перечитайте ссылку на mcve. Вы захотите создать и опубликовать небольшую программу, которая не имеет никаких функций, но которая отображает ваш графический интерфейс и показывает нам вашу проблему. Он должен быть небольшим, простым, компилироваться и запускаться без необходимости внешних образов, файлов, баз данных и т. д.   -  person Hovercraft Full Of Eels    schedule 10.12.2014
comment
Кроме того, вы не хотите устанавливать предпочтительные размеры чего-либо и почти никогда не должны вызывать updateUI() в графическом интерфейсе Swing, если вы не меняете внешний вид.   -  person Hovercraft Full Of Eels    schedule 10.12.2014


Ответы (2)


shiftIn.setBorder(new CompoundBorder(
    new TitledBorder(new EmptyBorder(0, 0, 0, 0), "Shift Key"), 
    shiftIn.getBorder()));

введите здесь описание изображения

Это не то, для чего была создана титульная рамка!

Используйте JLabel и поместите его в PAGE_START из BorderLayout, поместите JSpinner в PAGE_END. Добавьте этот контейнер (панель), где в данный момент добавлен счетчик. (Затем добавьте мнемонику для метки и сделайте ее «меткой» счетчика.)


Вот как можно использовать эту идею в другом макете (в этом примере GridLayout).

введите здесь описание изображения

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);
    }
}
person Andrew Thompson    schedule 10.12.2014
comment
@HovercraftFullOfEels Да. У вас правильный подход, но я все же предпочитаю использовать метку, если она предназначена для маркировки элемента управления. Возможно, используйте рамку с заголовком для группы элементов управления (как видно в eJuMiCa ). - person Andrew Thompson; 10.12.2014
comment
Код, который я использую, является частью гораздо большей программы. На панели также есть пара кнопок, и когда я добавляю JLabel в PAGE_START, метка просто идет слева от JSpinner. Также я использую GridBagLayout для компоновки своих компонентов Swing, но я не совсем уверен, как правильно использовать GridBagLayout. - person Meeesh; 10.12.2014
comment
Кроме того, я использую GridBagLayout для компоновки компонентов Swing. Перестаньте думать, что «используйте X-макет». Все графические интерфейсы (даже если мы используем один макет) состоят из нескольких макетов. Это то, что я имел в виду в своем комментарии выше об использовании JPanel с BorderLayout для метки и счетчика. Если вы добавите эту панель, куда GBL помещает счетчик, она будет работать, как рекламируется. Я могу только предполагать, что вы пытались добавить метку в PAGE_START BGL, что во всех смыслах не то, что я имел в виду. - person Andrew Thompson; 10.12.2014

Похоже, вы рискуете, возясь с границей 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);
   }
}
person Hovercraft Full Of Eels    schedule 10.12.2014
comment
Хорошо, это выглядит очень хорошо, однако моя jpanel также содержит несколько кнопок. Должен ли я просто создать отдельную JPanel или есть лучший способ. - person Meeesh; 10.12.2014
comment
Должен ли я просто создать отдельную панель JPanel? Да! Вкладывайте макеты друг в друга для сложных макетов. - person Andrew Thompson; 10.12.2014