Выровняйте текст и флажок JCheckBox на противоположных сторонах родителя

Есть ли простой способ выровнять только флажок в JCheckBox справа без создания отдельного компонента метки и флажка? Я знаю о setHorizontalTextPosition(SwingConstants.LEADING); Это приводит только к тому, что поле находится справа от текста, но не выравнивается по правому краю.

Что я хочу:

| Some sample text                                          ☑ |

вместо

| Some sample text ☑                                          |

Заранее спасибо!


person ricky3350    schedule 02.04.2016    source источник
comment
Также рассмотрим два столбца JTable со значениями модели типа Boolean.class в последнем столбце.   -  person trashgod    schedule 02.04.2016


Ответы (2)


Вы можете разделить метку и флажок в подходящем макете. Я сделал рамку шире на произвольный коэффициент, чтобы показать эффект.

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

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/a/2933256/230513 */
public class Test {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setLayout(new GridLayout(0, 1));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(createPanel("Some label"));
                frame.add(createPanel("Another label"));
                frame.add(createPanel("Yet another label"));
                frame.pack();
                frame.setSize(frame.getWidth() * 2, frame.getHeight());
                frame.setLocationByPlatform(true);
                frame.setVisible(true);
            }

            private JPanel createPanel(String s) {
                JPanel p = new JPanel(new BorderLayout());
                p.add(new JLabel(s, JLabel.LEFT), BorderLayout.WEST);
                p.add(new JCheckBox(), BorderLayout.EAST);
                p.setBorder(BorderFactory.createLineBorder(Color.blue));
                return p;
            }
        });
    }
}
person trashgod    schedule 02.04.2016

Вы можете вручную управлять пробелом в тексте значка каждый раз, когда изменяется размер флажка, добавляя ComponentListener к флажку:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        setLayout( new BorderLayout() );

        JCheckBox checkBox = new JCheckBox("Some Sample Text");
        checkBox.setHorizontalTextPosition(JCheckBox.LEADING);
        add(checkBox, BorderLayout.PAGE_START);

        checkBox.addComponentListener( new ComponentAdapter()
        {
            @Override
            public void componentResized(ComponentEvent e)
            {
                JCheckBox checkBox = (JCheckBox)e.getComponent();
                int preferredWidth = getPreferredSize().width;
                int actualWidth = getSize().width;
                int difference = actualWidth - preferredWidth;
                int gap = checkBox.getIconTextGap() + difference;
                gap = Math.max(UIManager.getInt("CheckBox.textIconGap"), gap);
                checkBox.setIconTextGap( gap );
            }
        });

    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}
person camickr    schedule 02.04.2016