2012-12-20 9 views
12

Comincerò con quello che voglio poi andare da lì:Avere un'etichetta Left e Right Aligned all'interno di un JCheckBox

+------------------------------------------+ 
|[] jCheckBox      jLabel | 
+------------------------------------------+ 

Fondamentalmente mi piacerebbe avere un JCheckBox con 2 segmenti di testo, 1 sinistra allineato e 1 allineato a destra. Vorrei che l'intera scatola fosse cliccabile e agisse esattamente come un JCheckBox (Come in se premo il mio mouse in basso evidenzia la casella ecc.).

ora ho provato:

  • Utilizzando HTML all'interno della casella di testo, con un tavolo lungo le linee di: <html><table width=100%><tr width=100%><td>Left Text</td><td align=right>Right Text</td></tr></table>. Questo produce [] Left TextRightText senza alcun allineamento visivo.

  • calcolata sia il JCheckBox e JLabel ad un pannello, tuttavia questo mi richiederebbe di attuare tutte le eventi del mouse e chiamare i rispettivi metodi corretti sul JCheckBox. Ho messo questo a parte - ma io sono disposto a riconsiderare se questa è l'unica opzione

  • Aggiunta del JLabel al JCheckBox

    • Innanzitutto questo ha causato il JCheckBox a decidere di cambiare il tipo di carattere, in modo che doveva essere 'aggiustato'
    • In secondo luogo, le linee di base erano spente di 1 o 2 pixel. Ciò è stato risolto implementando un LayoutManager che posizionava JLabel sulla linea di base.
    • In terzo luogo, la JLabel sovrapposto con il testo JCheckBox così ho annuncio a regolare il mio gestore di layout, ma il JCheckBox non ha dato un risultato corretto da getPreferedSize() (di [1,1]).

Quindi, in sostanza la mia domanda è: Come dovrei implementare questo?

+0

Quindi, se ho capito bene, vuoi che questo pannello composito si comporti esattamente come la casella di controllo all'interno, giusto? –

+0

Sì, in fondo è corretto – Lee

risposta

4
  • creare genitore JLabel, JLabel non hanno attuato alcuna LayoutManager, poi per impostare una corretta lì LayoutManager, penso che GridLayout (with 2 segments of text, 1 left aligned and 1 right aligned)

  • aggiungere lì due JLabels con un corretto allineamento (JLabel.setHorizontalAlignment(javax.swing.SwingConstants.XXX);)

  • messo insieme JCheckBox con il genitore JLabel (JLabel.setLabelFor(JCheckBox);)

  • allo stesso modo per MultiIcon in the JLabel

1
public class LeesCheckbox extends JPanel 
{ 
    private JCheckBox checkbox; 

    public LeesCheckbox(String leftText, String rightText){ 
     super(new BorderLayout()); 
     checkbox = new JCheckBox(leftText); 
     add(checkbox, BorderLayout.WEST); 
     add(new JLabel(rightText), BorderLayout.EAST); 
     setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       checkbox.setSelected(!checkbox.isSelected()); 
      } 
     }); 
    } 

    public JCheckBox getCheckbox() { 
     return checkbox; 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Box content = new Box(BoxLayout.Y_AXIS); 
     content.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     LeesCheckbox box = new LeesCheckbox("Left text", "Right text"); 
     box.setMaximumSize(new Dimension(Integer.MAX_VALUE, 25)); 
     content.add(box); 
     content.add(Box.createVerticalGlue()); 

     frame.setContentPane(content); 
     frame.setSize(300, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 
2

Questo è come sono riuscito a realizzarlo utilizzando un JCheckBox come classe genitore. Mancano metodi per l'impostazione del testo e del colore dell'etichetta.

package mock.dlect; 

import java.awt.Component; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.LayoutManager; 
import javax.swing.Icon; 
import javax.swing.JCheckBox; 
import javax.swing.JLabel; 

public class LeftRightCheck extends JCheckBox { 

    private final static JCheckBox DEFAULT_CHECK_BOX = new JCheckBox(); 
    private final JLabel rightLabel; 

    public LeftRightCheck(String leftText, String rightText, Icon icon, 
      boolean selected) { 
     super(leftText, icon, selected); 
     rightLabel = new JLabel(rightText, TRAILING); 
     // TODO figure out how to make the font work right on OSX 
     this.setLayout(new BaseLineSingleElementLayoutManager(10)); 
     this.add(rightLabel); 
    } 

    @Override 
    public final void setFont(Font font) { 
     font = font.deriveFont(DEFAULT_CHECK_BOX.getFont().getSize2D()); 
     super.setFont(font); 
     if (rightLabel != null) { 
      rightLabel.setFont(font); 
     } 
    } 

    private class BaseLineSingleElementLayoutManager implements LayoutManager { 

     private int hgap; 
     private Component component; 

     public BaseLineSingleElementLayoutManager(int hgap) { 
      this.hgap = hgap; 
     } 

     @Override 
     public void addLayoutComponent(String name, Component comp) { 
      // Do Nothing 
     } 

     @Override 
     public void removeLayoutComponent(Component comp) { 
      // Do Nothing 
     } 

     @Override 
     public Dimension preferredLayoutSize(Container parent) { 
      if (parent != null && parent instanceof JCheckBox) { 
       JCheckBox cc = (JCheckBox) parent; 
       // These 2 lines will add the size of the checkbox to the 
       // preferred size 
       Dimension parentSize = DEFAULT_CHECK_BOX.getPreferredSize(); 
       parentSize.width += cc.getFontMetrics(cc.getFont()). 
         stringWidth(cc.getText()) + hgap; 
       if (checkComponent(cc)) { 
        Dimension childSize = this.component.getPreferredSize(); 
        parentSize.height = Math.max(parentSize.height, 
          childSize.height); 
        parentSize.width += childSize.width; 
       } 
       return parentSize; 
      } 
      return new Dimension(); 
     } 

     @Override 
     public Dimension minimumLayoutSize(Container parent) { 
      return preferredLayoutSize(parent); 
     } 

     @Override 
     public void layoutContainer(Container parent) { 
      if (!checkComponent(parent)) { 
       return; 
      } 
      this.component.setSize(parent.getSize()); 
      this.component.setLocation(0, getBaseline(parent) 
        - getBaseline(this.component)); 
     } 

     private int getBaseline(Component c) { 
      return c.getBaseline(c.getWidth(), c.getHeight()); 
     } 

     protected boolean checkComponent(Container parent) { 
      if (parent == null) { 
       return false; 
      } else if (parent.getComponentCount() >= 1 
        && parent.getComponent(0).isVisible()) { 
       this.component = parent.getComponent(0); 
       return true; 
      } else { 
       return false; 
      } 
     } 
    } 
} 
Problemi correlati