JCheckBox "nichts auswählen"

Aloisia

Mitglied
Ich habe zwei Checkboxen(die haben ein Häkchen), in einer ButtonGroup. Wähle ich eine aus, ist die andere nicht mehr ausgewählt. Perfekt.
Aber wie schaffe ich es, dass durch Klicken auf ein ausgewähltes das Häckchen ganz verschwindet und keine Box ausgewählt ist?

Probiert habe ich ItemListener und MouseListener aber bei
Java:
chkBox1.setSelected(...);
habe ich ja wieder einen Wechsel und der Listener feuert wieder...und somit wieder und wieder...
 

Aloisia

Mitglied
Über einen Umweg über einen Button geht das...

Java:
ButtonGroup group= new ButtonGroup();
JCheckBox chk1= new JCheckBox();
JCheckBox chk2= new JCheckBox();
group.add(chk1);
group.add(chk2);
JButton btn = new JButton("clear");
btn.addActionListener(new ActionListener(){
  @Override
  public void actionPerformed(ActionEvent e) {
    group.clearSelection();
} });

Ich möchte aber, dass nichts ausgewählt wird, wenn ich auf eine bereits ausgewählte Box klicke.
 

Aloisia

Mitglied
Ich bekomme das einfach nicht richtig hin. Der ItemListener feuert bei jeder Veränderung...

Java:
  static ItemListener list1 = new ItemListener(){

     @Override
     public void itemStateChanged(ItemEvent e) {
       JCheckBox chkThis = (JCheckBox) e.getSource();
       if(chkThis.isSelected()){
         group.clearSelection();
       }
     
     }
   };

macht folgendes: Ich möchte eine Checkbox auswählen, klicke also mit der Maus darauf, dadurch ist (isSelected()=true) und der Listener feuert. Dann wird ja wieder gelöscht (isSelected()=false), der ItemListener feuert auch nochmal, aber diesmal tut er nichts (if...trifft nicht zu)
Ergebnis: ich kann keine Box auswählen
 

Aloisia

Mitglied
Ändere ich die If- Schleife (HAHAHAHA, musste sein) folgendermaßen ab:
Java:
if(!chkThis.isSelected()){
         group.clearSelection();
       }
Dann verhält es sich wie ohne Listener, ich kann nur eine Box selektieren, aber eine ist immer aktiv.
 

Aloisia

Mitglied
Heureka, habe mir was gebastelt. Alle JCheckBoxen sind in einer ButtonGroup "group" und adden diesen MouseListener.

Java:
private MouseListener uncheck = new MouseListener(){

        @Override
        public void mouseClicked(MouseEvent e) {
            released=((JCheckBox)e.getSource()).isSelected();
            if(pressed&&released){
                group.clearSelection();
            }
        }

        @Override
        public void mousePressed(MouseEvent e) {
             pressed =((JCheckBox)e.getSource()).isSelected();
          
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub
          
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub
          
        }

        @Override
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub
          
        }
      
    };

edit: Ich habe den Thema erledigt Button oder Link nicht. Nur einen Thema nicht weiter beobachten Link
 

Aloisia

Mitglied
Noch eine Frage zu den JCheckboxen, warum liefert jCheckBox.getIcon() null? gibt es da kein Standard Icon, dass angezeigt wird.
Ich bräuchte das, um die Box zu vergrößern...
 

Aloisia

Mitglied
Gibt es einen einfachen Weg die Checkbox zu vergrößern? Ich will, dass die Box(nicht der Text) 4 mal so groß ist.

Was ich bis jetzt habe:

Hol das Icon vom UIManager (Frage: wie bekomme ich die selectedIcon usw.?)
Mach ein SafeIcon daraus um es in ein Image casten zu können.
Mach aus dem Icon ein BufferedImage(sonst funktioniert die resize nicht)
Mach aus dem geänderten Image wieder ein Icon und setze es.


Java:
private void convertIcon(JCheckBox c){
       
        Icon oldIcon = UIManager.getIcon("CheckBox.icon");
        oldIcon = new SafeIcon(oldIcon);

        BufferedImage image = new BufferedImage(oldIcon.getIconWidth(), oldIcon.getIconHeight(), BufferedImage.TYPE_INT_RGB);
        oldIcon.paintIcon(this, image.getGraphics(), 0, 0);
       
        Icon newIcon = getNewImage(image);
        c.setIcon(newIcon);


Java:
 private Icon getNewImage(Image i){
        Image newOne = i.getScaledInstance(30, 30,Image.SCALE_DEFAULT);
        Icon newIcon = new ImageIcon(newOne);
        return newIcon;
    }


Die Klasse SafeIcon (nicht von mir!)


Java:
/**
     * Some ui-icons misbehave in that they unconditionally class-cast to the
     * component type they are mostly painted on. Consequently they blow up if
     * we are trying to paint them anywhere else (f.i. in a renderer). 
     *
     * This Icon is an adaption of a cool trick by Darryl Burke/Rob Camick found at
     * http://tips4java.wordpress.com/2008/12/18/icon-table-cell-renderer/#comment-120
     *
     * The base idea is to instantiate a component of the type expected by the icon,
     * let it paint into the graphics of a bufferedImage and create an ImageIcon from it.
     * In subsequent calls the ImageIcon is used.
     *
     */
    public static class SafeIcon implements Icon {

        private Icon wrappee;
        private Icon standIn;

        public SafeIcon(Icon wrappee) {
            this.wrappee = wrappee;
        }

        @Override
        public int getIconHeight() {
            return wrappee.getIconHeight();
        }

        @Override
        public int getIconWidth() {
            return wrappee.getIconWidth();
        }

        @Override
        public void paintIcon(Component c, Graphics g, int x, int y) {
            if (standIn == this) {
                paintFallback(c, g, x, y);
            } else if (standIn != null) {
                standIn.paintIcon(c, g, x, y);
            } else {
                try {
                   wrappee.paintIcon(c, g, x, y);
                } catch (ClassCastException e) {
                    createStandIn(e, x, y);
                    standIn.paintIcon(c, g, x, y);
                }
            }
        }

        /**
         * @param e
         */
        private void createStandIn(ClassCastException e, int x, int y) {
            try {
                Class<?> clazz = getClass(e);
                JComponent standInComponent = getSubstitute(clazz);
                standIn = createImageIcon(standInComponent, x, y);
            } catch (Exception e1) {
                // something went wrong - fallback to this painting
                standIn = this;
            }
        }

        private Icon createImageIcon(JComponent standInComponent, int x, int y) {
            BufferedImage image = new BufferedImage(getIconWidth(),
                    getIconHeight(), BufferedImage.TYPE_INT_ARGB);
              Graphics g = image.createGraphics();
              try {
                  wrappee.paintIcon(standInComponent, g, 0, 0);
                  return new ImageIcon(image);
              } finally {
                  g.dispose();
              }
        }

        /**
         * @param clazz
         * @throws IllegalAccessException
         */
        private JComponent getSubstitute(Class<?> clazz) throws IllegalAccessException {
            JComponent standInComponent;
            try {
                standInComponent = (JComponent) clazz.newInstance();
            } catch (InstantiationException e) {
                standInComponent = new AbstractButton() {

                };
                ((AbstractButton) standInComponent).setModel(new DefaultButtonModel());
            }
            return standInComponent;
        }

        private Class<?> getClass(ClassCastException e) throws ClassNotFoundException {
            String className = e.getMessage();
            className = className.substring(className.lastIndexOf(" ") + 1);
            return Class.forName(className);

        }

        private void paintFallback(Component c, Graphics g, int x, int y) {
            g.drawRect(x, y, getIconWidth(), getIconHeight());
            g.drawLine(x, y, x + getIconWidth(), y + getIconHeight());
            g.drawLine(x + getIconWidth(), y, x, y + getIconHeight());
        }

    }


Gibt es da eine einfachere Möglichkeit?

Meine Lösung erzeugt jetzt eine größere "Nichtangeklickt" Box, die sich aber beim Klick darauf nicht ändert.