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 อีกครั้ง คุณจะต้องสร้างและโพสต์โปรแกรมขนาดเล็กที่ไม่มีฟังก์ชันการทำงาน แต่จะแสดง GUI ของคุณและแสดงให้เราเห็นว่าปัญหาของคุณ ควรมีขนาดเล็ก เรียบง่าย และคอมไพล์และรันให้เราโดยไม่จำเป็นต้องใช้รูปภาพ ไฟล์ ฐานข้อมูลภายนอก ฯลฯ   -  person Hovercraft Full Of Eels    schedule 10.12.2014
comment
นอกจากนี้ คุณไม่ต้องการตั้งค่าขนาดที่ต้องการของสิ่งใดๆ และแทบจะไม่ต้องเรียก updateUI() ใน Swing GUI เลย เว้นแต่คุณจะเปลี่ยนรูปลักษณ์   -  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 เพื่อจัดวางส่วนประกอบการสวิงของฉัน แต่ฉันไม่แน่ใจว่าจะใช้ GridBagLayout ได้อย่างไร - person Meeesh; 10.12.2014
comment
@Meeesh แต่ฉัน.. ..ลืมแสดงความคิดเห็นนั้นให้เสร็จใช่ไหม ฉันต้องบอกว่ามันไม่สมเหตุสมผลมากจนถึงจุดนั้น หากต้องการความช่วยเหลือเพิ่มเติม ควรโพสต์ MCVE (ตัวอย่างที่ตรวจสอบได้สมบูรณ์น้อยที่สุด) หรือ SSCCE (สั้น มีอยู่ในตัว ตัวอย่างที่ถูกต้อง) ของเอฟเฟกต์นี้ - person Andrew Thompson; 10.12.2014
comment
นอกจากนี้ ฉันยังใช้ GridBagLayout เพื่อจัดวางส่วนประกอบวงสวิงของฉัน หยุดคิดว่า 'ใช้เค้าโครง X' GUI ทั้งหมด (แม้ว่าเราจะใช้เค้าโครงเดียว) จะประกอบด้วยหลายเค้าโครง นั่นคือสิ่งที่ฉันหมายถึงจากความคิดเห็นของฉันด้านบนเกี่ยวกับการใช้ 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