W sumie racja. Ale UI i tak można zmienić, żeby przyciski pasowały do reszty np:
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import javax.swing.plaf.basic.BasicSpinnerUI;
import javax.swing.plaf.basic.BasicArrowButton;
import javax.swing.JButton;
import java.awt.Color;
import javax.swing.JSpinner;
public class MySpinnerUI extends BasicSpinnerUI {
private JSpinner spinner;
private ActionListener sp_listener;
private MouseListener sp_mouselistener;
private BasicArrowButton up;
private BasicArrowButton down;
public MySpinnerUI(JSpinner spinner) {
this.spinner = spinner;
this.sp_listener = new SpinnerListener();
this.sp_mouselistener = new SpinnerMouseListener();
}
protected BasicArrowButton createNextButton() {
up = new BasicArrowButton(BasicArrowButton.NORTH,Color.BLACK,Color.DARK_GRAY, Color.GREEN, Color.LIGHT_GRAY);
up.setActionCommand("up");
up.addActionListener(sp_listener);
up.addMouseListener(sp_mouselistener);
return up;
}
protected BasicArrowButton createPreviousButton() {
down = new BasicArrowButton(BasicArrowButton.SOUTH,Color.BLACK,Color.DARK_GRAY, Color.GREEN, Color.LIGHT_GRAY);
down.setActionCommand("down");
down.addActionListener(sp_listener);
down.addMouseListener(sp_mouselistener);
return down;
}
private class SpinnerListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equalsIgnoreCase("up")) {
try {
spinner.getModel().setValue(spinner.getModel().getNextValue());
}catch(IllegalArgumentException ex) {
//maksymalna wartosc
}
} else if(e.getActionCommand().equalsIgnoreCase("down")) {
try {
spinner.getModel().setValue(spinner.getModel().getPreviousValue());
}catch(IllegalArgumentException ex) {
//minimalna wartosc
}
}
}
}
private class SpinnerMouseListener implements MouseListener {
private Thread click;
private boolean started = false;
public void mousePressed(MouseEvent e) {
if(e.getSource().equals(up)) {
try {
click.stop();
}catch(Exception ex) {}
click = new Thread(new ContinueChange(up));
click.start();
} else if(e.getSource().equals(down)) {
try {
click.stop();
}catch(Exception ex) {}
click = new Thread(new ContinueChange(down));
click.start();
}
}
public void mouseReleased(MouseEvent e) {
try {
click.stop();
}catch(Exception ex) {}
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
}
private class ContinueChange implements Runnable {
private long wait = 250;
private long wait_decr = 30; //spadek czasu oczekiwania po kliknieciu
private BasicArrowButton button;
public ContinueChange(BasicArrowButton button) {
this.button = button;
}
public void run() {
while(true) {
try {
button.doClick();
Thread.sleep(wait);
if(wait > 0) {
wait -= wait_decr;
if(wait<0) wait = 0;
}
}catch(InterruptedException e) {
return;
}
}
}
}
}
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.JComponent;
import javax.swing.BorderFactory;
import java.awt.Color;
public class SpinerTest extends JFrame {
private JSpinner spinner;
public SpinerTest() {
super("Spiner Test");
this.setSize(200,60);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);
spinner = new JSpinner();
spinner.setModel(new SpinnerNumberModel(50, 0 ,100 ,1));
spinner.setBounds(5,5,50,25);
JComponent editor=spinner.getEditor();
((JSpinner.DefaultEditor)editor).getTextField().setBackground(Color.BLACK);
((JSpinner.DefaultEditor)editor).getTextField().setForeground(Color.GREEN);
((JSpinner.DefaultEditor)editor).getTextField().setBorder(BorderFactory.createLineBorder(Color.GREEN,1));
spinner.setUI(new MySpinnerUI(spinner));
this.add(spinner);
this.show();
}
public static void main(String[] args) {
try {
new SpinerTest();
}catch(Exception e) {
System.out.println("Wystapil wyjatek:\n"+e.getClass().getCanonicalName()+":\n"+e.getCause());
}
}
}