2016-01-29 5 views
0

У меня есть следующий фрагмент кода,paintBorder переопределяется метод не вызывался

CustomBorderFactory.java

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Graphics; 

import javax.swing.border.Border; 
import javax.swing.border.EtchedBorder; 

public class CustomBorderFactory extends EtchedBorder { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public void paintBorder(Component c, Graphics g, int x, int y, int width, 
      int height) { 
     System.err.println("Painting here"); 
     int w = width; 
     int h = height; 

     g.translate(x, y); 

     g.setColor(etchType == LOWERED ? getShadowColor(c) 
       : getHighlightColor(c)); 
     g.drawRect(0, 0, w - 2, h - 2); 

     g.setColor(etchType == LOWERED ? getHighlightColor(c) 
       : getShadowColor(c)); 
     g.drawLine(1, h - 3, 1, 1); 
     g.drawLine(1, 1, w - 3, 1); 

     g.drawLine(0, h - 1, w - 1, h - 1); 
     g.drawLine(w - 1, h - 1, w - 1, 0); 

     g.translate(-x, -y); 
    } 

    public static Border createEtchedBorder(Color black, Color red) { 
     return new EtchedBorder(black, red); 
    } 
} 

Проблема, переопределенный paintBorder не вызывался.

В моем тестовом коде,

JPanel panel = new Jpanel(); 
panel.setBorder(CustomBorderFactory.createEtchedBorder(Color.black,Color.red)); 

Почему метод paintBorder в CustomBorderFactory класса не вызывался. (Я могу сказать, что sys.err не печатается), хотя его переопределенный и по-прежнему вызывает метод суперкласса.

Am new to java. Пожалуйста помоги!

+0

Это действительно избыточно? можете ли вы показать определение родительского метода? –

ответ

1

Ваш метод возвращает простой EtchedBorder:

public static Border createEtchedBorder(Color black, Color red) { 
     return new EtchedBorder(black, red); 
    } 

То, что вы хотите, возвращает экземпляр пользовательского класса:

public static Border createEtchedBorder(Color black, Color red) { 
     return new CustomBorderFactory(black, red); 
    } 

Обратите внимание, что имя вашего класса является запутанным, вы должны создать a CustomEtchedBorder класс, распространяющийся на EtchedBorder, а затем на настоящий заводский класс CustomBorderFactory, который возвратил бы экземпляр CustomEtchedBorder, когда вы позвоните createEtchedBorder().

+0

Но как я могу удостовериться, что вызвал переопределенный метод paintBorder. – user3164187

+0

Как только вы предоставите свою пользовательскую границу с помощью своего метода paintComponent, будет вызван метод overriden. – Berger

Смежные вопросы