Browse Source

Made sure to properly install/uninstall listeners to avoid NPEs when switching look and feels.

master
Hendrik Schreiber 8 years ago
parent
commit
2d30faa40e
  1. BIN
      build/darcula.jar
  2. 25
      src/com/bulenkov/darcula/ui/DarculaPasswordFieldUI.java
  3. 76
      src/com/bulenkov/darcula/ui/DarculaTextFieldUI.java

BIN
build/darcula.jar

Binary file not shown.

25
src/com/bulenkov/darcula/ui/DarculaPasswordFieldUI.java

@ -25,29 +25,42 @@ import javax.swing.text.JTextComponent;
import java.awt.*; import java.awt.*;
import java.awt.event.FocusAdapter; import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
/** /**
* @author Konstantin Bulenkov * @author Konstantin Bulenkov
*/ */
public class DarculaPasswordFieldUI extends BasicPasswordFieldUI { public class DarculaPasswordFieldUI extends BasicPasswordFieldUI {
@SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"}) private FocusListener myFocusListener = new FocusAdapter() {
public static ComponentUI createUI(final JComponent c) {
c.addFocusListener(new FocusAdapter() {
@Override @Override
public void focusGained(FocusEvent e) { public void focusGained(FocusEvent e) {
c.repaint(); getComponent().repaint();
} }
@Override @Override
public void focusLost(FocusEvent e) { public void focusLost(FocusEvent e) {
c.repaint(); getComponent().repaint();
} }
}); };
@SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"})
public static ComponentUI createUI(final JComponent c) {
return new DarculaPasswordFieldUI(); return new DarculaPasswordFieldUI();
} }
@Override
protected void installListeners() {
super.installListeners();
getComponent().addFocusListener(myFocusListener);
}
@Override
protected void uninstallListeners() {
getComponent().removeFocusListener(myFocusListener);
super.uninstallListeners();
}
@Override @Override
protected void paintBackground(Graphics graphics) { protected void paintBackground(Graphics graphics) {
Graphics2D g = (Graphics2D)graphics; Graphics2D g = (Graphics2D)graphics;

76
src/com/bulenkov/darcula/ui/DarculaTextFieldUI.java

@ -32,62 +32,78 @@ import java.awt.event.*;
* @author Konstantin Bulenkov * @author Konstantin Bulenkov
*/ */
public class DarculaTextFieldUI extends BasicTextFieldUI { public class DarculaTextFieldUI extends BasicTextFieldUI {
private enum SearchAction {POPUP, CLEAR}
private final JTextField myTextField;
protected JLabel myClearIcon;
protected JLabel myRecentIcon;
public DarculaTextFieldUI(JTextField textField) { private final FocusListener myFocusListener = new FocusAdapter() {
myTextField = textField;
}
@SuppressWarnings("MethodOverridesStaticMethodOfSuperclass")
public static ComponentUI createUI(final JComponent c) {
final DarculaTextFieldUI ui = new DarculaTextFieldUI((JTextField)c);
c.addFocusListener(new FocusAdapter() {
@Override @Override
public void focusGained(FocusEvent e) { public void focusGained(FocusEvent e) {
c.repaint(); getComponent().repaint();
} }
@Override @Override
public void focusLost(FocusEvent e) { public void focusLost(FocusEvent e) {
c.repaint(); getComponent().repaint();
} }
}); };
c.addMouseMotionListener(new MouseMotionAdapter() {
private final MouseMotionListener myMouseMotionListener = new MouseMotionAdapter() {
@Override @Override
public void mouseMoved(MouseEvent e) { public void mouseMoved(MouseEvent e) {
if (ui.getComponent() != null && isSearchField(c)) { if (getComponent() != null && isSearchField(getComponent())) {
if (ui.getActionUnder(e) != null) { if (getActionUnder(e) != null) {
c.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
} else { } else {
c.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR)); getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
} }
} }
} }
}); };
c.addMouseListener(new MouseAdapter() {
private final MouseListener myMouseListener = new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
if (isSearchField(c)) { if (isSearchField(getComponent())) {
final SearchAction action = ui.getActionUnder(e); final SearchAction action = getActionUnder(e);
if (action != null) { if (action != null) {
switch (action) { switch (action) {
case POPUP: case POPUP:
ui.showSearchPopup(); showSearchPopup();
break; break;
case CLEAR: case CLEAR:
((JTextField)c).setText(""); getComponent().setText("");
break; break;
} }
e.consume(); e.consume();
} }
} }
} }
}); };
return ui;
private enum SearchAction {POPUP, CLEAR}
protected JLabel myClearIcon;
protected JLabel myRecentIcon;
@SuppressWarnings("MethodOverridesStaticMethodOfSuperclass")
public static ComponentUI createUI(final JComponent c) {
return new DarculaTextFieldUI();
}
@Override
protected void installListeners() {
super.installListeners();
final JTextComponent c = getComponent();
c.addFocusListener(myFocusListener);
c.addMouseMotionListener(myMouseMotionListener);
c.addMouseListener(myMouseListener);
}
@Override
protected void uninstallListeners() {
final JTextComponent c = getComponent();
c.removeMouseListener(myMouseListener);
c.removeMouseMotionListener(myMouseMotionListener);
c.removeFocusListener(myFocusListener);
super.uninstallListeners();
} }
protected void showSearchPopup() { protected void showSearchPopup() {
@ -110,7 +126,7 @@ public class DarculaTextFieldUI extends BasicTextFieldUI {
} }
protected Rectangle getDrawingRect() { protected Rectangle getDrawingRect() {
final JTextComponent c = myTextField; final JTextComponent c = getComponent();
final Insets i = c.getInsets(); final Insets i = c.getInsets();
final int x = i.right - 4 - 16; final int x = i.right - 4 - 16;
final int y = i.top - 3; final int y = i.top - 3;

Loading…
Cancel
Save