JSpinner Panah dalam posisi ganjil saat digunakan dengan JLabel

Halo Jadi saya telah membuat JFrame dengan JSpinner di dalamnya (seperti yang Anda lihat di gambar). Saat ini, BorderLabel ditampilkan di Jspinner (sebagaimana mestinya) tetapi panah di JSpinner ada sebagai bagian dari keseluruhan, bukan hanya bidang JSpinner. Saya memerlukan bantuan untuk mengetahui cara memasang panah JSpinner di bilah. Terima kasih.

masukkan deskripsi gambar di sini

Buat kamu yang minta kode,

Saya juga rindu menyatakan JLabel Sebelumnya. Maksudku 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 sumber
comment
Saat mengajukan pertanyaan tentang posisi dan tata letak komponen, Anda perlu memposting kode yang relevan, sebaiknya mcve. Jika tidak, pertanyaannya akan muncul, silakan tebak mengapa kode yang saya tidak tunjukkan kepada Anda adalah pertanyaan yang tidak berfungsi, pertanyaan yang sangat sulit dijawab.   -  person Hovercraft Full Of Eels    schedule 10.12.2014
comment
JLabel ditampilkan di Jspinner (sebagaimana mestinya) - Haruskah? Kedengarannya sudah salah...   -  person MadProgrammer    schedule 10.12.2014
comment
Silakan baca atau baca ulang tautan mcve. Anda mungkin ingin membuat dan memposting program kecil yang tidak memiliki fungsi, tetapi menampilkan GUI Anda dan menunjukkan kepada kami masalah Anda. Itu harus kecil, sederhana, dan dapat dikompilasi dan dijalankan untuk kita tanpa memerlukan gambar, file, database dari luar, dll.   -  person Hovercraft Full Of Eels    schedule 10.12.2014
comment
Selain itu, Anda tidak ingin menyetel ukuran apa pun yang diinginkan dan hampir tidak perlu memanggil updateUI() di Swing GUI kecuali Anda mengubah tampilan dan nuansa.   -  person Hovercraft Full Of Eels    schedule 10.12.2014


Jawaban (2)


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

masukkan deskripsi gambar di sini

Ini bukanlah tujuan pembuatan perbatasan bertajuk!

Gunakan JLabel dan letakkan di PAGE_START dari BorderLayout, letakkan JSpinner di PAGE_END. Tambahkan wadah (panel) tempat spinner ditambahkan saat ini. (Kemudian tambahkan mnemonik untuk label dan jadikan itu 'label untuk' spinner.)


Ini adalah cara menggunakan ide itu di dalam tata letak lain (GridLayout dalam contoh ini)..

masukkan deskripsi gambar di sini

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 Ya. Pendekatan Anda adalah pendekatan yang valid, tetapi saya masih lebih suka menggunakan label jika ingin memberi label pada kontrol. Mungkin menggunakan batas berjudul untuk grup kontrol (seperti yang terlihat di eJuMiCa). - person Andrew Thompson; 10.12.2014
comment
Kode yang saya gunakan adalah bagian dari program yang jauh lebih besar. Panel di sana juga memiliki beberapa tombol dan ketika saya menambahkan JLabel di PAGE_START labelnya berada di sebelah kiri JSpinner. Saya juga menggunakan GridBagLayout untuk menata letak komponen ayunan saya, tetapi saya tidak yakin bagaimana cara menggunakan GridBagLayout dengan baik. - person Meeesh; 10.12.2014
comment
@Meeesh tapi saya.. ..lupa menyelesaikan komentar itu? Saya harus mengatakan, sampai saat itu hal itu tidak masuk akal. Untuk bantuan lebih lanjut, akan lebih baik untuk memposting MCVE (Contoh Verifikasi Lengkap Minimal) atau SSCCE (Contoh Singkat, Mandiri, Benar) tentang efek ini. - person Andrew Thompson; 10.12.2014
comment
Saya juga menggunakan GridBagLayout untuk mengatur tata letak komponen ayunan saya Berhenti berpikir 'gunakan tata letak X'. Semua GUI (walaupun kita menggunakan satu layout) terdiri dari beberapa layout. Itulah yang saya maksud dari komentar saya di atas tentang penggunaan JPanel dengan BorderLayout untuk label dan spinner. Jika Anda menambahkan panel tempat GBL meletakkan spinner, itu akan berfungsi seperti yang diiklankan. Saya hanya dapat menebak Anda mencoba menambahkan label di PAGE_START BGL, dan bukan itu maksud saya. - person Andrew Thompson; 10.12.2014

Anda tampaknya menghadapi risiko dengan mengacaukan perbatasan JSpinner. Saya sendiri, saya akan membungkus JSpinner saya dalam JPanel dan kemudian memberikan pembungkus JPanel itu batas yang diinginkan. Misalnya:

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
Oke itu terlihat sangat bagus namun jpanel saya di sana berisi banyak tombol juga. Haruskah saya membuat JPanel terpisah atau ada cara yang lebih baik. - person Meeesh; 10.12.2014
comment
Haruskah saya membuat JPanel terpisah saja.. Ya! Tata letak sarang di dalam satu sama lain untuk kebutuhan tata letak yang kompleks. - person Andrew Thompson; 10.12.2014