Avatar billede stigc Nybegynder
27. maj 2004 - 21:47 Der er 13 kommentarer og
1 løsning

Margin i Jlist

Jeg har lavet en tilpasset jlist via ListCellRenderer
Men i min Jlist står checkboxes helt op af venstre side. jeg mangler lidt margin. Hvordan sætter jeg den?

  protected class CellRenderer implements ListCellRenderer
  {
      public Component getListCellRendererComponent(
                    JList list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus)
      {
        JCheckBox checkbox = (JCheckBox) value;
        checkbox.setBackground(isSelected ? getSelectionBackground() : getBackground());
        checkbox.setForeground(isSelected ? getSelectionForeground() : getForeground());
        checkbox.setEnabled(isEnabled());
        checkbox.setFont(getFont());
        checkbox.setFocusPainted(false);
        checkbox.setBorderPainted(true);
        checkbox.setBorder(isSelected ? UIManager.getBorder("List.focusCellHighlightBorder") : noFocusBorder);
        return checkbox;
      }
  }
Avatar billede _carsten Nybegynder
27. maj 2004 - 21:57 #1
Er det en indre klasse ???
Avatar billede billen Nybegynder
27. maj 2004 - 22:14 #2
Hvad med at lægge JCheckBox på en JPanel og så returnere panelet i steden. På panelet kan du jo så vælge f.eks. flowlayout og sætte marging på den.
Avatar billede stigc Nybegynder
27. maj 2004 - 22:23 #3
Ja det har jeg også tænkt. Men er det ikke muligt at sætte en margin på en component?
Avatar billede stigc Nybegynder
27. maj 2004 - 22:24 #4
Ja inner class...

public class CheckBoxList extends JList
{
  protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);

  public CheckBoxList()
  {
      setCellRenderer(new CellRenderer());

      addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
              int index = locationToIndex(e.getPoint());

              if (index != -1) {
                  JCheckBox checkbox = (JCheckBox)
                              getModel().getElementAt(index);
                  checkbox.setSelected(
                                    !checkbox.isSelected());
                  repaint();
              }
            }
        }
      );

      setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  }

  protected class CellRenderer implements ListCellRenderer
  {
      public Component getListCellRendererComponent(
                    JList list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus)
      {
        JCheckBox checkbox = (JCheckBox) value;
        checkbox.setBackground(isSelected ? getSelectionBackground() : getBackground());
        checkbox.setForeground(isSelected ? getSelectionForeground() : getForeground());
        checkbox.setEnabled(isEnabled());
        checkbox.setFont(getFont());
        checkbox.setFocusPainted(false);
        checkbox.setBorderPainted(true);
        checkbox.setBorder(isSelected ? UIManager.getBorder("List.focusCellHighlightBorder") : noFocusBorder);
        return checkbox;
      }
  }
}
Avatar billede Slettet bruger
27. maj 2004 - 22:29 #5
Hvad med (på din JCheckBox) at bruge en CompoundBorder, som består af den allerede eksisterende border og en emptyborder hvor left-margin er sat til X pixel ?
Avatar billede stigc Nybegynder
27. maj 2004 - 22:30 #6
jo der lyder godt. Hvordan ser det ud?
Avatar billede _carsten Nybegynder
27. maj 2004 - 22:31 #7
Prøv lige at override getInsets og se om det ikke er løsningen

public java.awt.Insets getInsets(){
  return new java.awt.Insets(5,5,5,5);
}

Tilføj metoden til din CheckBoxList

Ps. gider ikke mere i dag.
Avatar billede Slettet bruger
27. maj 2004 - 22:36 #8
checkbox.setBorder(createCompoundBorder(BorderFactory.createEmptyBorder(50, 0, 0, 0), isSelected ? UIManager.getBorder("List.focusCellHighlightBorder") : noFocusBorder));

burde kunne gøre det, uden at skulle oprette en custom komponent, hvor getInsets bliver overridet...
Avatar billede stigc Nybegynder
27. maj 2004 - 22:37 #9
Det virkede. Du behøver ikke mere :)
Avatar billede _carsten Nybegynder
27. maj 2004 - 22:39 #10
Var getInsets() løsningen ??
Avatar billede _carsten Nybegynder
27. maj 2004 - 22:43 #11
> corholio
Det drejer sig jo om at lave en større og unødvendig grænse på en komponent, når metoden getInsets er lavet til lige nøjagtig det formål, nemlig at bestemme hvor i en komponent, at andre komponenter skal indsættes.

Vil tillade mig at lægge et svar
Avatar billede _carsten Nybegynder
27. maj 2004 - 22:44 #12
Kommer her!
Avatar billede stigc Nybegynder
27. maj 2004 - 22:46 #13
Avatar billede Slettet bruger
27. maj 2004 - 22:47 #14
ja ok, sorry..... jeg burde nok ha' læst spørgsmålet lidt mere grundigt igennem.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester