Olá, eu estou criando uma biblioteca para formatar as minhas interfaces, como se fosse um look and feel, eu invoco um objeto e chamo o método formatar do mesmo e passo como parâmetro um container, então tudo que estiver dentro desse container é formatado, já testei e usei muitas vezes essa classe e nunca deu nenhum erro mais agora a pouco quando eu comecei a implementar a formatação para jcombobox aparece isso:
`
Exception in thread "main" java.lang.NullPointerException
at LookAndFeel.TKFLookAndFeel.formatar(TKFLookAndFeel.java:143)
at Main.Login.format2(Login.java:343)
at Main.Login.<init>(Login.java:98)
at Main.Login.main(Login.java:162)
`
A classe da biblioteca:
`
package LookAndFeel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Polygon;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedTKFLookAndFeelException;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.basic.BasicComboBoxUI;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.Area;
import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Objects;
import javax.accessibility.Accessible;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.JWindow;
import javax.swing.ListCellRenderer;
import javax.swing.UIManager;
import javax.swing.UnsupportedTKFLookAndFeelException;
import javax.swing.border.AbstractBorder;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.ComboBoxUI;
import javax.swing.plaf.basic.BasicArrowButton;
import javax.swing.plaf.basic.BasicComboBoxUI;
import javax.swing.plaf.basic.BasicComboPopup;
public class TKFLookAndFeel implements KeyListener,FocusListener{
private static final Color BACKGROUND = Color.GREEN;
private static final Color FOREGROUND = Color.BLUE;
private static final Color SELECTIONFOREGROUND = Color.RED;
public boolean boo = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);
JLabel caps = new JLabel("!");
public static List<Component> getAllComponents(final Container c) {
Component[] comps = c.getComponents();
List<Component> compList = new ArrayList<Component>();
for (Component comp : comps) {
compList.add(comp);
if (comp instanceof Container){
compList.addAll(getAllComponents((Container) comp));
}
}
return compList;
}
static ImageIcon getTriangulo() {
BufferedImage buffer = new BufferedImage(30,30, BufferedImage.TRANSLUCENT);
Graphics2D g = buffer.createGraphics();
Polygon p = new Polygon();
g.setColor(Color.red);
p.addPoint(0,15);
p.addPoint(15, 30);
p.addPoint(30,15);
g.fillPolygon(p);
return new ImageIcon(buffer);
}
public void formatar(Container c){
caps.setBorder(BorderFactory.createEmptyBorder(0,0,0,5));
caps.setVisible(false);
c.addKeyListener(this);
try {
UIManager.setTKFLookAndFeel(UIManager.getSystemTKFLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
Logger.getLogger(TKFLookAndFeel.class.getName()).log(Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
Logger.getLogger(TKFLookAndFeel.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(TKFLookAndFeel.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnsupportedTKFLookAndFeelException ex) {
Logger.getLogger(TKFLookAndFeel.class.getName()).log(Level.SEVERE, null, ex);
}
List<Component> list = getAllComponents(c);
for(Component component:list){
if(component instanceof JButton){
System.out.println(((JButton) component).getText());
if(((JButton) component).getIcon()==null){
if(component.getParent().getLayout() instanceof FlowLayout){
component.setFont(new Font("Comic Sans MS",Font.BOLD,20));
}else{
component.setFont(new Font("Comic Sans MS",Font.BOLD,30));
}
}
component.setBackground(Color.RED);
((JButton) component).setBorderPainted(false);
component.setFocusable(false);
if(component.getParent().getLayout() instanceof FlowLayout){
component.addMouseListener(new MouseAdapter(){
Dimension dn = new Dimension(0,0);
public void mouseReleased(MouseEvent arg0) {
component.setSize(dn);
}
public void mousePressed(MouseEvent arg0) {
component.setSize(component.getWidth()-10,component.getHeight()-10);
}
public void mouseExited(MouseEvent arg0) {
component.setSize(dn);
}
public void mouseEntered(MouseEvent arg0) {
dn = new Dimension(component.getWidth(),component.getHeight());
component.setSize(component.getWidth(),component.getHeight()+5);
}
});
}else if(!(component.getParent().getLayout() instanceof GridLayout)){
component.addMouseListener(new MouseAdapter(){
Dimension dn = new Dimension(0,0);
public void mouseReleased(MouseEvent arg0) {
component.setSize(dn);
}
public void mousePressed(MouseEvent arg0) {
component.setSize(component.getWidth()-10,component.getHeight()-10);
}
public void mouseExited(MouseEvent arg0) {
component.setSize(dn);
}
public void mouseEntered(MouseEvent arg0) {
dn = new Dimension(component.getWidth(),component.getHeight());
component.setSize(component.getWidth()+5,component.getHeight()+5);
}
});
}
}else if(component instanceof JLabel){
if(((JLabel) component).getIcon()==null){
if(component.getParent().getLayout() instanceof GridLayout){
((JLabel)component).setHorizontalAlignment(JLabel.RIGHT);
((GridLayout)component.getParent().getLayout()).setHgap(10);
((GridLayout)component.getParent().getLayout()).setVgap(10);
}else{
((JLabel)component).setHorizontalAlignment(JLabel.CENTER);
}
if(component.getParent().getLayout() instanceof FlowLayout
||component.getParent().getLayout() instanceof GridLayout){
component.setFont(new Font("Comic Sans MS",Font.BOLD,20));
}else{
component.setFont(new Font("Comic Sans MS",Font.BOLD,30));
}
}
}else if(component instanceof JComboBox){
UIManager.put("ComboBox.border", new borda());
UIManager.put("ComboBox.foreground", FOREGROUND);
UIManager.put("ComboBox.background", BACKGROUND);
UIManager.put("ComboBox.selectionForeground", SELECTIONFOREGROUND);
UIManager.put("ComboBox.selectionBackground", BACKGROUND);
((JComboBox)component).setFont(new Font("Comic Sans MS",Font.BOLD,30));
((JComboBox)component).setUI(new BasicComboBoxUI() {
protected JButton createArrowButton() {
JButton b = new JButton(getTriangulo());
b.setContentAreaFilled(false);
b.setBorderPainted(false);
return b;
}
});
Object o = ((JComboBox)component).getAccessibleContext().getAccessibleChild(0);
if (o instanceof JComponent) {
JComponent comp = (JComponent) o;
comp.setBorder(new RoundedCornerBorder());
comp.setForeground(FOREGROUND);
comp.setBackground(BACKGROUND);
}
((JComboBox)component).addPopupMenuListener(new HeavyWeightContainerListener());
}else if(component instanceof Container){
component.setBackground(Color.YELLOW);
}
if(component instanceof Window){
((Window) component).addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.out.println("fechou");
System.exit(0);
}
});
}
if(component instanceof JTextField){
((JTextField) component).setLayout(new BorderLayout());
component.addKeyListener(this);
component.addFocusListener(this);
component.setFont(new Font("Comic Sans MS",Font.BOLD,20));
component.setBackground(Color.WHITE);
((JTextField) component).setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED, Color.BLACK, Color.BLACK));
}
if(component instanceof JPanel){
if(((JPanel)component).getLayout() instanceof GridLayout){
((JPanel) component).setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
}
}
if(component instanceof JTextArea){
component.setFont(new Font("Comic Sans MS",Font.BOLD,15));
component.setBackground(Color.WHITE);
((JTextArea) component).setLineWrap(true);
}
}
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_CAPS_LOCK){
boo = !boo;
if(e.getSource() instanceof JTextField){
((Container)e.getSource()).add(caps,BorderLayout.EAST);
caps.setVisible(boo);
}
}
}
public void keyReleased(KeyEvent e) {
}
public void focusGained(FocusEvent e) {
boo = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);
((Container)e.getSource()).add(caps,BorderLayout.EAST);
caps.setVisible(boo);
}
public void focusLost(FocusEvent e) {
caps.setVisible(false);
}
}
class borda extends AbstractBorder {
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int r = 12;
int w = width - 1;
int h = height - 1;
Area round = new Area(new RoundRectangle2D.Double(x, y, w, h, r, r));
Container parent = c.getParent();
if (Objects.nonNull(parent)) {
g2.setPaint(parent.getBackground());
Area corner = new Area(new Rectangle2D.Double(x, y, width, height));
corner.subtract(round);
g2.fill(corner);
}
g2.setPaint(c.getForeground());
g2.draw(round);
g2.dispose();
}
@Override public Insets getBorderInsets(Component c) {
return new Insets(4, 8, 4, 8);
}
@Override public Insets getBorderInsets(Component c, Insets insets) {
insets.set(4, 8, 4, 8);
return insets;
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
return null;
}
}
class HeavyWeightContainerListener implements PopupMenuListener {
@Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
JComboBox combo = (JComboBox) e.getSource();
Accessible a = combo.getUI().getAccessibleChild(combo, 0);
if (a instanceof BasicComboPopup) {
BasicComboPopup pop = (BasicComboPopup) a;
Container top = pop.getTopLevelAncestor();
if (top instanceof JWindow) {
//http://ateraimemo.com/Swing/DropShadowPopup.html
System.out.println("HeavyWeightContainer");
((JWindow) top).setBackground(new Color(0x0, true));
}
}
}
});
}
@Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
@Override public void popupMenuCanceled(PopupMenuEvent e) {}
}
class RoundedCornerBorder extends AbstractBorder {
protected static final int ARC = 12;
@Override public void paintBorder(
Component c, Graphics g, int x, int y, int width, int height) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int r = ARC;
int w = width - 1;
int h = height - 1;
Area round = new Area(new RoundRectangle2D.Float(x, y, w, h, r, r));
if (c instanceof JPopupMenu) {
g2.setPaint(c.getBackground());
g2.fill(round);
} else {
Container parent = c.getParent();
if (Objects.nonNull(parent)) {
g2.setPaint(parent.getBackground());
Area corner = new Area(new Rectangle2D.Float(x, y, width, height));
corner.subtract(round);
g2.fill(corner);
}
}
g2.setPaint(c.getForeground());
g2.draw(round);
g2.dispose();
}
@Override public Insets getBorderInsets(Component c) {
return new Insets(4, 8, 4, 8);
}
@Override public Insets getBorderInsets(Component c, Insets insets) {
insets.set(4, 8, 4, 8);
return insets;
}
}
class RoundedCornerBorder1 extends RoundedCornerBorder {
//http://ateraimemo.com/Swing/RoundedComboBox.html
@Override public void paintBorder(
Component c, Graphics g, int x, int y, int width, int height) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int r = ARC;
int w = width - 1;
int h = height - 1;
Area round = new Area(new RoundRectangle2D.Float(x, y, w, h, r, r));
Rectangle b = round.getBounds();
b.setBounds(b.x, b.y + r, b.width, b.height - r);
round.add(new Area(b));
Container parent = c.getParent();
if (Objects.nonNull(parent)) {
g2.setPaint(parent.getBackground());
Area corner = new Area(new Rectangle2D.Float(x, y, width, height));
corner.subtract(round);
g2.fill(corner);
}
g2.setPaint(c.getForeground());
g2.draw(round);
g2.dispose();
}
}
class RoundedCornerBorder2 extends RoundedCornerBorder {
@Override public void paintBorder(
Component c, Graphics g, int x, int y, int width, int height) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int r = ARC;
int w = width - 1;
int h = height - 1;
Path2D.Float p = new Path2D.Float();
p.moveTo(x, y);
p.lineTo(x, y + h - r);
p.quadTo(x, y + h, x + r, y + h);
p.lineTo(x + w - r, y + h);
p.quadTo(x + w, y + h, x + w, y + h - r);
p.lineTo(x + w, y);
p.closePath();
Area round = new Area(p);
g2.setPaint(c.getBackground());
g2.fill(round);
g2.setPaint(c.getForeground());
g2.draw(round);
g2.setPaint(c.getBackground());
g2.drawLine(x + 1, y, x + width - 2, y);
g2.dispose();
}
}
class Arrow extends BasicArrowButton{
int direction;
public Arrow(int direction) {
super(direction);
}
static ImageIcon getTriangulo() {
BufferedImage buffer = new BufferedImage(600, 600, BufferedImage.TRANSLUCENT);
Graphics2D g = buffer.createGraphics();
Polygon p = new Polygon();
g.setColor(Color.red);
p.addPoint(0, 50);
p.addPoint(25, 0);
p.addPoint(50, 50);
g.fillPolygon(p);
return new ImageIcon(buffer);
}
protected void paintComponent(Graphics g) {
if(direction==BasicArrowButton.SOUTH){
ImageIcon img = getTriangulo();
img.paintIcon(this, g,10,10);
}
}
}
class ColorArrowUI extends BasicComboBoxUI {
public static ComboBoxUI createUI(JComponent c) {
return new ColorArrowUI();
}
static ImageIcon getTriangulo() {
BufferedImage buffer = new BufferedImage(600, 600, BufferedImage.TRANSLUCENT);
Graphics2D g = buffer.createGraphics();
Polygon p = new Polygon();
g.setColor(Color.red);
p.addPoint(0, 50);
p.addPoint(25, 0);
p.addPoint(50, 50);
g.fillPolygon(p);
return new ImageIcon(buffer);
}
BasicArrowButton basic = new BasicArrowButton(BasicArrowButton.SOUTH);
@Override protected JButton createArrowButton() {
BasicArrowButton ba = new BasicArrowButton(BasicArrowButton.SOUTH);
return ba;
}
}
`
Classe que estou montando a janela (excedi a quanidade de caracteres então adicionei o arquivo):
código.txt (12.1 KB)
Alguém sabe me explicar o porque desse null pointer exception?