Avatar billede ozman Nybegynder
30. maj 2004 - 14:44 Der er 10 kommentarer og
1 løsning

runde JButtons

Er det muligt at lave runde JButtons??? - Og hvordan?
Avatar billede arne_v Ekspert
30. maj 2004 - 14:49 #1
Avatar billede ozman Nybegynder
30. maj 2004 - 14:56 #2
øhh..oki. Den virker ret avanceret. Er det ikke muligt at lave lidt lettere?
Avatar billede arne_v Ekspert
30. maj 2004 - 15:05 #3
De tvivler jeg meget på.

Det er et meget specielt krav.
Avatar billede ozman Nybegynder
30. maj 2004 - 15:08 #4
Ja det er jo rigtigt nok. Jeg havde bare håbet på at man kunne undgå alt det kode. Men der er jo ikke andet at gøre end at prøve så. :-)
Avatar billede arne_v Ekspert
30. maj 2004 - 15:21 #5
Muligvis kan selve koden forsimples en anelse.

Men princippet med at extende JButton of override paintComponent
er nok måden.

Jeg tror iøvrigt at carsten har lavet et eksempel her engang.
Avatar billede _carsten Nybegynder
31. maj 2004 - 15:28 #6
Jeg så lige titlen på dette spørgsmål, og man kunne jo godt få brug for runde knapper, så det gjorde spørgsmålet lidt interessant.

Jeg mener ikke at jeg har lavet et eksempel før herinde, men om ikke andet, så er her en modificeret udgave af den som findes her http://java.sun.com/developer/TechTips/1999/tt0826.html som jeg selv synes er væsentlig bedre og som følger default look and feel.

Jeg kan bare ikke finde ud af hvilken farve grænsen har, men det er der måske andre som har lyst til at rode lidt mere med.

Her kommer test klasse og den runde knap!

public class TestButton extends javax.swing.JFrame {

    public TestButton() {
        initComponents();
    }

    private void initComponents() {
        roundButton1 = new RoundButton();
        roundButton2 = new RoundButton("Round");
        jButton1 = new javax.swing.JButton();

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        getContentPane().add(roundButton1);

        roundButton2.setText("Round");
        getContentPane().add(roundButton2);

        jButton1.setText("jButton1");
        getContentPane().add(jButton1);

        pack();
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new TestButton().show();
    }

    private javax.swing.JButton jButton1;
    private RoundButton roundButton1;
    private RoundButton roundButton2;
}





import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import javax.swing.JButton;

public class RoundButton extends JButton {
    public RoundButton() {
        this("");
    }
 
    public RoundButton(String label) {
        super(label);
        setOpaque(false);
        Dimension size = getPreferredSize();
            size.width = size.height = Math.max(size.width,
            size.height);
        setPreferredSize(size);
        setContentAreaFilled(true);
    }

    protected void paintComponent(Graphics g) {
        contains(0,0);
        g.setClip(shape);
        super.paintComponent(g);
    }

    protected void paintBorder(Graphics g) {
        g.setColor(Color.lightGray);
        g.drawOval(1, 1, getSize().width-2, getSize().height-2);
        if(getModel().isRollover()){
            g.setColor(g.getColor().darker());
            g.drawOval(2, 2, getSize().width-4, getSize().height-4);
        }
    }

    public boolean contains(int x, int y) {
        if (shape == null ||
        !shape.getBounds().equals(getBounds())) {
        shape = new Ellipse2D.Float(0, 0,
            getWidth(), getHeight());
        }
        return shape.contains(x, y);
    }

    private Shape shape;
}
Avatar billede arne_v Ekspert
31. maj 2004 - 16:03 #7
Jeg må huske forkert
Avatar billede _carsten Nybegynder
31. maj 2004 - 16:32 #8
Rart at høre det også kan ske for dig :)
Avatar billede ozman Nybegynder
31. maj 2004 - 18:50 #9
Tak skal du have...Arne er det iorden at carsten får point? Lige et spørgsmål til carsten: Hvad er grunden til at du i constructoren kalder initComponents()? -Hvorfor ligger du ikke bare alt informationen fra initComponents() direkte ind i constructoren. (Jeg er bare nysgerrig)
Avatar billede arne_v Ekspert
31. maj 2004 - 18:51 #10
Selvfølgelig er det da i orden.
Avatar billede _carsten Nybegynder
31. maj 2004 - 19:11 #11
Det er der flere grunde til.

1. Jeg bruger for det meste NetBeans og den gør det automatisk.
2. Sådan vil jeg ALTID gøre det, gør at tingene bliver langt mere overskueligt.

Når man eksempelvis laver GUI, kommer du nemt op flere hundrede linier kode, og det meget hurtigere at fejlsøge og overskue nogle små metoder på op til 50 linier (jeg prøver iøvrigt at holde mine metoder på max. 30 linier)

Eksempel
    public TestButton() {
        initComponents();
          System.out.println("initComponents() er OK");
        initierDit();
          System.out.println("initierDit(); er OK");
        initierDat();
          System.out.println("initierDat(); er OK");
        samlDetHeleSammen();
          System.out.println("samlDetHeleSammen(); er OK");
        addDetHeleTilFrame();
          System.out.println("HURRA DET VIRKER!!");
    }

Det er nemt at finde ud af hvor det går galt i ovenstående constructor, men jeg kunne sagtens have puttet et par tusinde linier kode ind i stedet for, det ville kun gøre min constructor - nærmest ulæselig.
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