setHorizontalAlignment hinzufügen

MScalli

Erfahrenes Mitglied
Hi Leutz.
Da ich leider noch nicht das nötige Know How habe um mir meine eigenen JButtons zu erzeugen habe ich mich im Netz umgeschaut und ne Super Klasse gefunden..
Jetzt kann man hier aber die Methode setHorizontalAlignment() nicht verwenden und die bräuchte ich unbedingt.
Ich weiss Ehrlich gesagt nicht wie man das anstellt..
Kann ich sie in dieser Klasse irgendwie einfügen.. leider ist mir diese art von Programmierung(noch) viel zu hoch.
Kann mir wer helfen

Ausserdem wird hier awt verwendet.. kann das Probleme geben
denn überall schreibt man das swing und awt nicht gemischt werden soll!!

hier mal der aufruf
Code:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class VectorButtonTest {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JButton vb = new VectorButton();
        vb.setFont(new Font("Dialog",Font.PLAIN,22));
        vb.setForeground(new Color(50,50,255));
        vb.setBackground(Color.white);
        vb.setForeground(new Color(50,255,0));
        vb.setText("OK");
        // vb.setMargin(new Insets(0,30,0,30));
        vb.setBorderPainted(false);
        frame.getContentPane().add(vb);
        frame.pack();
        frame.show();
    }

}

und jetzt die Klasse VectorButton
Code:
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;


public class VectorButton extends JButton implements MouseListener {
    public VectorButton() {
        this.addMouseListener(this);
    }
    
    public Dimension getPreferredSize() {
        String text = getText();
        FontMetrics fm = this.getFontMetrics(getFont());
        float scale = (50f/30f)*this.getFont().getSize2D();
        int w = fm.stringWidth(text);
        w += (int)(scale*1.4f);
        int h = fm.getHeight();
        h += (int)(scale*.3f);
        return new Dimension(w,h);
    }
    
    public void paintComponent(Graphics g) {        
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(this.getBackground());
        g2.fillRect(0,0,this.getWidth(),this.getHeight());
        
        float scale = (50f/30f)*this.getFont().getSize2D();
        
        drawLiquidButton(this.getForeground(),
            this.getWidth(), this.getHeight(),
            getText(), scale,
            g2);
    }
    
    protected void drawLiquidButton(Color base, 
                int width, int height, 
                String text, float scale, 
                Graphics2D g2) {
        
        // calculate inset
        int inset = (int)(scale*0.04f);
        int w = width - inset*2 - 1;
        int h = height - (int)(scale*0.1f) - 1;
        
        
        g2.translate(inset,0);
        drawDropShadow(w,h,scale,g2);
        
        if(pressed) {
            g2.translate(0, 0.04f*scale);
        }

        drawButtonBody(w,h,scale,base,g2);
        drawText(w,h,scale,text,g2);
        drawHighlight(w,h,scale,base,g2);
        drawBorder(w,h,scale,g2);
        
        if(pressed) {
            g2.translate(0, 0.04f*scale);
        }
        g2.translate(-inset,0);
    }
    
    protected void drawDropShadow(int w, int h, float scale, Graphics2D g2) {
            // draw the outer drop shadow
        g2.setColor(new Color(0,0,0,50));
        this.fillRoundRect(g2,
            (-.04f)*scale,
            (.02f)*scale,
            w+.08f*scale, h+0.08f*scale,
            scale*1.04f, scale*1.04f);
        g2.setColor(new Color(0,0,0,100));
        this.fillRoundRect(g2,0,0.06f*scale,w,h,scale,scale);
    }
    
    protected void drawButtonBody(int w, int h, float scale,
        Color base, Graphics2D g2) {
            // draw the button body
        Color grad_top = base.brighter();
        Color grad_bot = base.darker();        
        GradientPaint bg = new GradientPaint(
            new Point(0,0), grad_top,
            new Point(0,h), grad_bot);
        g2.setPaint(bg);
        this.fillRoundRect(g2,
            (0)*scale,
            (0)*scale,
            w,h,1*scale,1*scale);
        
        // draw the inner color
        Color inner = base.brighter();
        inner = alphaColor(inner,75);
        g2.setColor(inner);
        this.fillRoundRect(g2, 
            scale*(.4f), 
            scale*(.4f), 
            w-scale*.8f, h-scale*.5f,
            scale*.6f,scale*.4f);
    }
    
    protected void drawText(int w, int h, float scale, 
            String text, Graphics2D g2) {
        // calculate the width and height
        int fw = g2.getFontMetrics().stringWidth(text);
        int fh = g2.getFontMetrics().getAscent() -
            g2.getFontMetrics().getDescent();
        int textx = (w-fw)/2;
        int texty = h/2 + fh/2;

        // draw the text
        g2.setColor(new Color(0,0,0,70));
        g2.drawString(text,(int)((float)textx+scale*(0.04f)), 
            (int)((float)texty + scale*(0.04f)));
        g2.setColor(Color.black);
        g2.drawString(text, textx, texty);
    }
    
    
    protected void drawHighlight(int w, int h, float scale,
        Color base, Graphics2D g2) {
        // create the highlight
        GradientPaint highlight = new GradientPaint(
            new Point2D.Float(scale*0.2f,scale*0.2f),
            new Color(255,255,255,175),
            new Point2D.Float(scale*0.2f,scale*0.55f),
            new Color(255,255,255,0)
            );
        g2.setPaint(highlight);
        this.fillRoundRect(g2, scale*0.2f, scale*0.1f, 
            w-scale*0.4f, scale*0.4f, scale*0.8f, scale*0.4f);
        this.drawRoundRect(g2, scale*0.2f, scale*0.1f, 
            w-scale*0.4f, scale*0.4f, scale*0.8f, scale*0.4f);
    }

    protected void drawBorder(int w, int h, 
        float scale, Graphics2D g2) {
        // draw the border
        g2.setColor(new Color(0,0,0,150));
        this.drawRoundRect(g2,
            scale*(0f),
            scale*(0f),
            w,h,scale,scale);
    }
    
    // float version of fill round rect
    protected static void fillRoundRect(Graphics2D g2,
                float x, float y, 
                float w, float h, 
                float ax, float ay) {
        g2.fillRoundRect(
            (int)x, (int)y,
            (int)w, (int)h,
            (int)ax, (int)ay
            );
    }
    
    // float version of draw round rect
    protected static void drawRoundRect(Graphics2D g2,
                float x, float y, 
                float w, float h, 
                float ax, float ay) {
        g2.drawRoundRect(
            (int)x, (int)y,
            (int)w, (int)h,
            (int)ax, (int)ay
            );
    }
    
    // generate the alpha version of this color
    protected static Color alphaColor(Color color, int alpha) {
        return new Color(color.getRed(), color.getGreen(),
            color.getBlue(), alpha);
    }
    
    
    /* mouse listener implementation */
    protected boolean pressed = false;
    public void mouseExited(MouseEvent evt) { }
    public void mouseEntered(MouseEvent evt) { }
    public void mouseClicked(MouseEvent evt) { }
    public void mouseReleased(MouseEvent evt) { 
        pressed = false;
    }
    public void mousePressed(MouseEvent evt) {
        pressed = true;
    }
    
    
    
    public static void p(String s) {
        System.out.println(s);
    }
}
 
Hallo,

man kann nicht so einfach eine Methode von einer Klasse in eine andere Klasse importieren. Du wirst das schon selbst umsetzen müssen.

MFG

Sascha
 
da textx und texty ja die berechneten anfangspunkte sind könnt ich textx einfach auf 0 setzen.

nur weiss ich nicht wie ich das hin bekomme das ich dann sagen kann.

Code:
button.setHorizontalAlignment(SwingConstants.LEFT)

LEFT wäre hier der wert 2.. das könnt ich schon abfragen.
Nur weiss ich leider nicht wie ich den AUFRUF bewerkstelligen soll
 
Welchen Aufruf?
Du schreibst eine Methode die genau so heißt. Setzt dann irgendein Flag in deiner Klasse und zeichnest den Text an die richtige Stelle.

MFG

Sascha
 
Überschreib doch einfach die Methode setHorizontalAlignment von JButton in VectorButton. Also in VectorButton

Code:
public void setHorizontalAlignment( int alignment )
{
    // prüfen ob das überhaupt ein gültiges alignment ist //
    if( alignment != SwingConstants.LEFT && alignment != SwingConstants.CENTER && ... )
        return;
    this.alignment = alignment;
}
natürlich musst du dazu noch ein attribut private int alignment einfügen.
und in paintComponent() bzw. eben in der methode wo der text geschrieben wird fragst du dann ab, wo der text stehen soll, rechnest die koordinaten aus und fertig.
dann kannst du
VectorButton button = new VectorButton();
button.setHorizontalAlignment(SwingConstants.LEFT);
machen.

dazu würd ich noch ne public int getHorizontalAlignment() machen....
 
das mit der Abfrage dazu ist natürlich noch super.

bei LEFT mach ich dann jetzt
Code:
        // Hier wird abgefragt Wo die Schrift sein soll(Alignment)
        if(alignment == 2){
        	textx = 1;
        }else{
        	textx = (w-fw)/2;
        }

textx kann ja bisschen variieren.. hab halt mal 1 genommen.
brauche gerade nur das LEFT alignment. aber ich denke das ich das mal um alle erweitern werde sobald bisschen zeit ist ;)

vielen dank
 
Zurück