# paint-Methode überschreiben



## Cheefrocker (14. Aug 2008)

Hallo zusammen,

ich habe folgendes Problem ich habe ein eigene Border-Klasse geschrieben. wenn ich diesen Border um eine Komponente wie z.b JPanel lege klappt alles einwandfrei. Wenn ich aber auf das Panel andere Komponenten lege werden diese komisch angezeigt. 

so sollte es nicht aussehen wird es aber angezeigt:








so sollte es eigentlich aussehen:








das Komisch ist. zuerst wird so angezeigt wie das erste bild. geh ich dann über die komponenten dann wird es wie unten normal angezeigt.

Was muss ich machen damit das richtig angezeigt wird??? Muss man irgentwie repaint oder ähnliches beim Border machen, oder beim Panel welches dann den Border kriegt? 


hier noch  meine Borderklasse:


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Border;


import java.awt.BasicStroke;
import java.awt.Color;


import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import javax.swing.border.AbstractBorder;

public class HorizontalDashedBorder extends AbstractBorder {

    protected Color lineColor;

    public HorizontalDashedBorder() {
        lineColor = Color.DARK_GRAY;
    }

    public Insets getBorderInsets(Component c) {
        return new Insets(1, 1, 1, 1);
    }

    public boolean isBorderOpaque() {
        return false;
    }

    public void paintBorder(Component c, Graphics g, int x, int y, int width,
            int height) {
        Color oldColor = g.getColor();
        g.setColor(lineColor);
        ((Graphics2D) g).setStroke(new BasicStroke(1, 0, 0, 1, new float[]{3f, 3f}, 0));

        int i = 0;//Abstand nach innen.

       // g.drawRect(x + i, y + i, width - i - i - 1, height - i - i - 1);//Rechteck kommplette Umrandung
           g.drawLine(x, y, width,0);//horizontalline oben
        //g.drawLine(0, 0, 0,height);//Verticalline
           g.drawLine(0, height-1, width,height-1);//horizontalline unten
        //   System.out.println(x);
        //    System.out.println(y);
        //    System.out.println(width);
        //   System.out.println(height);
        g.setColor(oldColor);
    //links 
    //    for(int i = y; (i + 10) <= height; i+=20){ 
    //       g.drawLine(x, i, x, i+length);          
    //    } 

    //rechts 
    //    for(int i = y; (i + 10) <= height; i+=20){ 
    //       g.drawLine(width - 1, i, width - 1, i+length);          
    //    } 
        re
    }
}
```

vielleicht kann jemand helfen. danke im voraus.


----------



## Guest (14. Aug 2008)

schwer zu sagen... wie rufest du es auf??? mach kleines programm...


----------



## Cheefrocker (14. Aug 2008)

ich hab jPanel der mit setBorder(new HorizontalDashedBorder ()); den Border kriegt. 

aus diesem jPanel habe ich eine Bean-Komponente gemacht die ich dann in einer IDE verwende. 

auf dem Panel plaziere weitere Beans(selbsterstelle jPanels) mit addComponent....

das wars eigentlich.


----------



## Guest (14. Aug 2008)

ja mach kurz ein programm wo es auftritt


----------



## Cheefrocker (14. Aug 2008)

```
package javaapplication1;

import Border.HorizontalDashedBorder;
import gui.Content_Subnavigator;
import gui.Content_Subnavigator_Button;
import javax.swing.JFrame;


public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        JFrame n = new JFrame();
        n.setSize(500, 300);
        
        //Panel auf dem weitere Panels plaziert sind. 
        Content_Subnavigator panel = new Content_Subnavigator();
        
        //Border setzen
        panel.setBorder(new HorizontalDashedBorder());
        
        // dem panel weitere komponenten einfügen. 
        Content_Subnavigator_Button button = new  Content_Subnavigator_Button();
        Content_Subnavigator_Button button2 = new Content_Subnavigator_Button();
        panel.add(button);
        panel.add(button2);
        
        
        //Panel adden
        n.add(panel);
        
        
        n.setVisible(true);
        
    }

}
```


----------



## Cheefrocker (14. Aug 2008)

Oder kann es damit zusammen hängen das ich falsch von jPanel abgeleitet habe und er deshalb nicht richtig reagiert? 

```
public class Content_Subnavigator extends JPanel {

    /** Creates new form BeanForm */
    public Content_Subnavigator() {
    super();
    }
....
}
```


----------



## Guest (14. Aug 2008)

ich bräuchte schon alle klassen sonst wird des nichts


----------



## Cheefrocker (14. Aug 2008)

mir ist auch aufgefallen das wenn ich in der beispielanwendung  resize dann krieg ich das erste bild. wenn ich die das panel kliege als auf die komponenten dann wird es ordentlich gezeichnet.


----------



## Cheefrocker (14. Aug 2008)

alle klassen wird schwierig, da ich netbeans layoutmanager verwende.


----------



## Cheefrocker (14. Aug 2008)

Content_Subnavigator


```
/*
 * Content_Subnavigator.java
 *
 * Created on 14. August 2008, 11:48
 */

package gui;

import javax.swing.JPanel;

/**
 *
 *
 */
public class Content_Subnavigator extends JPanel {

    /** Creates new form BeanForm */
    public Content_Subnavigator() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        setBackground(new java.awt.Color(153, 153, 255));
        setBorder(new HorizontalDashedBorder());
    }// </editor-fold>


    // Variables declaration - do not modify
    // End of variables declaration

}
```


----------



## Cheefrocker (14. Aug 2008)

Content_Subnavigation_Button

```
/*
 * Content_Subnavigation_Button.java
 *
 * 
 */

package gui;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import javax.swing.JPanel;

/**
 *
 *  */
public class Content_Subnavigator_Button extends JPanel {

    /** Creates new form BeanForm */
    public Content_Subnavigator_Button() {
        initComponents();
        setCursor (new Cursor (Cursor.HAND_CURSOR));
       
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        Button1 = new gui.Button();
        jLabel1 = new javax.swing.JLabel();

        setBackground(new java.awt.Color(192, 206, 216));
        setMaximumSize(new java.awt.Dimension(200, 20));
        setMinimumSize(new java.awt.Dimension(200, 17));
        setPreferredSize(new java.awt.Dimension(200, 17));
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                formMouseEntered(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                formMouseExited(evt);
            }
        });
        setLayout(null);

        Button1.setBackground(new java.awt.Color(98, 121, 139));
        Button1.setAlignmentY(0.0F);
        add(Button1);
        Button1.setBounds(5, 5, 10, 10);

        jLabel1.setFont(new java.awt.Font("Verdana", 0, 11)); // NOI18N
        jLabel1.setText("null null");
        add(jLabel1);
        jLabel1.setBounds(30, -1, 150, 20);
    }// </editor-fold>                        

private void formMouseEntered(java.awt.event.MouseEvent evt) {                                  
// TODO add your handling code here:#
   jLabel1.setFont( new Font( "Verdana", Font.BOLD, 11));
   Button1.setBackground(Color.YELLOW);
}                                 

private void formMouseExited(java.awt.event.MouseEvent evt) {                                 
// TODO add your handling code here:
   jLabel1.setFont( new Font( "Verdana", Font.PLAIN, 11 ));
   Button1.setBackground(Color.GRAY);
}                                


    // Variables declaration - do not modify                     
    private gui.Button Button1;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                   

    
     public void setSubnavigatorButtonText(String Name)
     {
        jLabel1.setText(Name);
     }
     

}
```


----------



## Gast2 (14. Aug 2008)

variablen werden klein geschrieben....

du musst noch einfügen


> Button1.setBorder(null);



in deinem initComponents...

aber ich versteh nicht warum du nicht einfach von JButton erbst ...
aber egal wenn du des einfügst dann passt es


----------



## Cheefrocker (14. Aug 2008)

@sirWayne leider hast das setzen des Border auf null keine Auswirkung.


----------



## Gast2 (14. Aug 2008)

also bei funktioniert es kommt drauf an wo in setzt...


----------



## Cheefrocker (14. Aug 2008)

kann ich setborder in den subnavigator panel bzw in subnavigator_button setzen? 

ich will ihn nicht immer beim aufruf im Frame setzen müssen. 

wenn ich das hier mache funzt es auch nicht:


```
Content_Subnavigator_Button button = new Content_Subnavigator_Button();
        Content_Subnavigator_Button button2 = new Content_Subnavigator_Button();

        button.setBorder(null);
        button2.setBorder(null);
```


----------



## Gast2 (14. Aug 2008)

in deinem initComponents...........


```
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;

import javax.swing.JButton;
import javax.swing.JPanel;

/**
*
*  */
public class Content_Subnavigator_Button extends JPanel {

    /** Creates new form BeanForm */
    public Content_Subnavigator_Button() {
        initComponents();
        setCursor (new Cursor (Cursor.HAND_CURSOR));

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */

    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        Button1 = new JButton();
        jLabel1 = new javax.swing.JLabel();
        Button1.setBorder(null);
        setBackground(new java.awt.Color(192, 206, 216));
        setMaximumSize(new java.awt.Dimension(200, 20));
        setMinimumSize(new java.awt.Dimension(200, 17));
        setPreferredSize(new java.awt.Dimension(200, 17));
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                formMouseEntered(evt);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                formMouseExited(evt);
            }
        });
        setLayout(null);

        Button1.setBackground(new java.awt.Color(98, 121, 139));
        Button1.setAlignmentY(0.0F);
        add(Button1);
        Button1.setBounds(5, 5, 10, 10);

        jLabel1.setFont(new java.awt.Font("Verdana", 0, 11)); // NOI18N
        jLabel1.setText("null null");
        add(jLabel1);
        jLabel1.setBounds(30, -1, 150, 20);
    }// </editor-fold>

private void formMouseEntered(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:#
   jLabel1.setFont( new Font( "Verdana", Font.BOLD, 11));
   Button1.setBackground(Color.YELLOW);
}

private void formMouseExited(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
   jLabel1.setFont( new Font( "Verdana", Font.PLAIN, 11 ));
   Button1.setBackground(Color.GRAY);
}


    // Variables declaration - do not modify
    private JButton Button1;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration


     public void setSubnavigatorButtonText(String Name)
     {
        jLabel1.setText(Name);
     }
}
```


----------



## Cheefrocker (14. Aug 2008)

ja das ist mir schon klar  aber ich leite von Jpanel ab, dachte davon den Border auf null. 

aber kann ich ihm nicht einen individuellen border noch verpassen dem Button??? z.b BevelBorder


----------



## Gast2 (14. Aug 2008)

ich weiß nicht ob er den Border von dem übergeordneten Komponente nimmt... 
musst du ausprobieren

aber wie gesagt ich würde eh von JButton ableiten


----------



## Gast (14. Aug 2008)

und wie kann ich das nachbilden wenn ich jButton ableite? Kannste mir ein tipp geben? vielleicht ist es ja eh die bessere variante.


----------



## Gast2 (14. Aug 2008)

kommt drauf an was du vor hast du kannst ziemlich viel machen...

um was du zu malen kannst du paintComponent von deinem JButton überschreiben...
mit dem getModel bekommst dein button model mit welchem du abfragen kannst ob er gerade gedrückt ist ob drüber gefahren wird usw. je nachdem kannst du was malen lassen...
du kannst aber auch einfach setText() nehmen und set Icon so hast du einen text + ein icon und und du hast eub standard button ist()...
du kannst dir auch verschiedene selber gemalte bilder machen und bei jedem z.B. button ist gedrückt, button rollover kannst dem enstprechend ein Bild setzen... kannst du alles in der paintMethode machen mit dem model brauchst halt nur die entsprechende bilder dazu...


----------

