Παρασκευή 14 Φεβρουαρίου 2020

Point JTextField Java




Αντι να εχω 2 JTextField s

για να κουναω ενα Point με
το πληκτρολογιο,,,,

εχω 1 με ποντικι (και πληκτρα) !
------------------------








/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package jim.lib.j;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Point2D;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import jim.Jim;
import jim.lib.a.Dmtn;
import jim.lib.a.Thr;
import jim.lib.d.Path;
import jim.lib.d.Point;
import jim.lib.j.swing.Jfr;
import jim.lib.j.swing.Jspl;
import jim.lib.j.swing.Jtf;
import jim.lib.j.swing.Manager;
import jim.lib.p.PaintNode;

/**
 * created at 14 Φεβ 2020
 * @author jimakoskx
 */
public class JArrows4Tf extends Jtf{
   
    public static void main(String[] args) {
        JArrows4Tf test1=new JArrows4Tf(1,2);
        JArrows4Tf test2=new JArrows4Tf(1.0,3.0,-10,10,1);
        test1.isReversingPaintMode=false;
        test2.isReversingPaintMode=true;
        test1.setName("test1");
        test2.setName("test2");
        test1.cutTextToLong=true;


       
        Jfr jfr=new Jfr(new Jspl(1,test1,test2).q(0.5).qCont());
        jfr.setBounds(0,0,888,222);
    }
   
    static ComponentListener CML=new ComponentListener() {
        @Override
        public void componentResized(ComponentEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.resizedArrows4Tf();}
        }
        @Override
        public void componentMoved(ComponentEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.movedArrows4Tf();}
        }

        @Override
        public void componentShown(ComponentEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.shownArrows4Tf();}
        }

        @Override
        public void componentHidden(ComponentEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.hiddenArrows4Tf();}
        }
    };
    static MouseMotionListener MML=new MouseMotionListener() {
        @Override
        public void mouseDragged(MouseEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.draggedArrows4Tf(e);}
        }

        @Override
        public void mouseMoved(MouseEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.movedArrows4Tf(e);}
        }
    };
    static MouseListener ML=new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.clickedArrows4Tf(e);}
        }
        @Override
        public void mousePressed(MouseEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.pressedArrows4Tf(e);}
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.releasedArrows4Tf(e);}
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.enteredArrows4Tf(e); }
        }
        @Override
        public void mouseExited(MouseEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.exitedArrows4Tf(e);}
        }
    };

    static KeyListener KL=new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {}
        @Override
        public void keyPressed(KeyEvent e) {//System.out.println("shifter");
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.klcheckingOneByShift(e);}
        }
        @Override
        public void keyReleased(KeyEvent e) {
            JArrows4Tf src=(JArrows4Tf)e.getComponent();
            if(src!=null){src.klcheckingOneByShift(e);}
        }
    };
    static KeyListener KLparser=new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {}
        @Override
        public void keyPressed(KeyEvent e) {//System.out.println("parser");
            if(e.getKeyCode()==KeyEvent.VK_ENTER){
                JArrows4Tf src=(JArrows4Tf)e.getComponent();
                if(src!=null){src.parseText();}
            }
        }
        @Override
        public void keyReleased(KeyEvent e) {}
    };
   
    /**
     * need low Alpha for the text of JTextField to be visible
     */
    static Color arrowsColorDefault=new Color(143,44,0,90);
   
   
    //System.out.println("l"+SwingConstants.LEFT);
    //System.out.println("r"+SwingConstants.RIGHT);
    //System.out.println("b"+SwingConstants.BOTTOM);
    //System.out.println("t"+SwingConstants.TOP);   
    static final int swUp1=1;
    static final int swLeft2=2;
    static final int swDown3=3;
    static final int swRight4=4;
    static final String swStr[]=new String[]{"Center","Up","Left","Down","Right"};
   
    static long sleepBetweenPointIncDecrCalls=50;//20 frames per second
    static Thr unicMouseTimeMover=new Thr(){
        @Override
        public void doWork() {
            JArrows4Tf src=(JArrows4Tf)workOn.getUserObject();
            //System.out.println("working on "+src.getName());
            while(src.draggedDir4>0){
                //System.out.println("calling for "+swStr[src.draggedDir4]);
                src.applyAgainCurrDirectionToPoint();
                sl(sleepBetweenPointIncDecrCalls);
            }
        }
    }.q("JArrows4Tf.unicMouseTimeMover");
   
    static{
        unicMouseTimeMover.start();
    }   
    ///////////////////////////////////////////////////////////////
    ///////  C L A S S       H E R E   ////////////////////////////
    ///////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
   

    Point val=new Point(0,0);
    Point stepAbs=new Point(1,1);
    Point min=new Point(Jim.minlong,Jim.minlong);
    Point max=new Point(Jim.maxlong,Jim.maxlong);
    Point temp=new Point(0,0);
   
   
    Path pLeft=new Path();
    PaintNode pnLeft=new PaintNode(pLeft).qfill();
    Path pRight=new Path();
    PaintNode pnRight=new PaintNode(pRight).qfill();
    Path pUp=new Path();
    PaintNode pnUp=new PaintNode(pUp).qfill();
    Path pDown=new Path();
    PaintNode pnDown=new PaintNode(pDown).qfill();
    /**
     * if even w > h may need to draw arrows vertically (or opposite)...may dummy never be used
     */
    boolean isReversingPaintMode=false;
    /**
     * width , w/2 , w/3 , 2*(w/3)
     */
    int w,wd2,wd3,wd32;
    /**
     * height , h/2 , h/3 , 2*(h/3)
     */
    int h,hd2,hd3,hd32;
   
   
    /**
     * if(false) then arrows not showing if mouse is out of JTextField
     */
    boolean arrowsAlwaysOn=true;
    /**
     *  Up0,Left1,Down2,Right3 Point move modes
     */
    /**
     * updated direction on dragging (before releasing mouse button)
     */
    int draggedDir4=-1;
    /**
     * Triggering starts when user press mouse on JTextfield<br>
     * MouseMotionListener and KeyListener will be added
     * Buffer of the static Thread will be filled with a reference to this Object<br>
     */
    int pressedDir4=-1;
    /**
     * According of the mouse button for slow,normal,quick speed of the Point movement
     */
    int multiplier=1;
    /**
     * If user suddenly while moving the Point press shift then we must slow speed<br>
     * to be easy to adjust at exact point
     */
    boolean isShiftDown=false;
    /**
     * One instead of STEP....cancelling step that is usually adjusted with multiplier !
     */
    int one=1;
   
   
    Dmtn buttons=new Dmtn();//MultipliersPerButtons ..binary search just for 1,2,3 values? Answer:...Just easy programming

    /**
     *
     */
    public JArrows4Tf (){
        super("OLA KALA EDO ");
        //setCursor(Cursor.getDefaultCursor());//no text cursor
        setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));//


        painter=new PaintNode();
        painter.q(arrowsColorDefault);
        painter.add(pnDown);
        painter.add(pnLeft);
        painter.add(pnRight);
        painter.add(pnUp);
       
       
        buttons.abin(MouseEvent.BUTTON1).crad(1);
        //buttons.abin(MouseEvent.BUTTON2).crad(1);
        buttons.abin(MouseEvent.BUTTON3).crad(3);
       
       
        addComponentListener(CML);
        addKeyListener(KLparser);
        addMouseListener(ML);
        refreshText();
    }
   
    public JArrows4Tf (double x,double y){
        this();
        val.x=x;
        val.y=y;
        refreshText();
    }
    public JArrows4Tf (double x,double y,double minv,double maxv,double stepv){
        this();
        if( stepv<=0 || (minv>=maxv) || x<minv || y<minv || x>maxv || y>maxv || (maxv-minv<stepv) ){
            throw new IllegalArgumentException("JArrows4Tf NOT if( step<=0 || (min>=max) || x<min || y<min || x>max || y>max || (max-min<step) )");
        }     
        val.x=x;
        val.y=y;
       
        min.x=minv;
        min.y=minv;
       
        max.x=maxv;
        max.y=maxv;
       
        stepAbs.x=stepv;
        stepAbs.y=stepv;
       
        refreshText();
    }
   
   
   
   
   
    /**
     * Override to notify for the new Point
     */
    public void xyChanged(){
        //System.out.println("must implement by class programmer user");
    }
    /**
     * Check limits and if ok sets and calls valuesChanged()
     * @param x
     * @param y
     * @return
     */
    public boolean setxy(double x,double y){
        if( x<min.x || x>max.x || y<min.y || y>max.y  ){
            return false;
        }
        else{
            val.x=x;
            val.y=y;
            xyChanged();
            refreshText();
            return true;
        }
    }
    public void setxyNoCheck(double x,double y){
        val.x=x;
        val.y=y;
        xyChanged();
        refreshText();
    }
    public void setxNoCheck(double x){
        val.x=x;
        xyChanged();
        refreshText();
    }
    public void setyNoCheck(double y){
        val.y=y;
        xyChanged();
        refreshText();
    }

    public boolean checkxy(double x,double y){
        return !( x<min.x || x>max.x || y<min.y || y>max.y );
    }
    public boolean checkx(double x){
        return !( x<min.x || x>max.x);
    }
    public boolean checky(double y){
        return !( y<min.y || y>max.y );
    }

   
   
    public int xi(){return (int)val.x;}
    public int yi(){return (int)val.y;}
    public long xl(){return (long)val.x;}
    public long yl(){return (long)val.y;}
    public double x(){return val.x;}
    public double y(){return val.y;}
   
    public void getxy(Point2D p){
        p.setLocation(val.x,val.y);
    }
    synchronized void parseText(){
        String text=getText();
        Point p=new Point();
        Exception e=jim.lib.d.Point.parsePoint(text, p);
        if(e!=null){
            JOptionPane.showMessageDialog(this, e,"Unable to parse Point from Text",JOptionPane.INFORMATION_MESSAGE);
        }
        else{
            if(setxy(p.x,p.y)){
                //System.out.println("good");
            }
            else{
                JOptionPane.showMessageDialog(this, "attempted to set \n("+p.x+","+p.y+")\nNot allowed because of\nlimitations\n"+getLimitsText(),"Values out of limits",JOptionPane.INFORMATION_MESSAGE);
                refreshText();
            }
        }
    }
    public String getLimitsText(){
        return min.x+" <= x <= "+max.x+" \n"+min.y+" <= y <= "+max.y+" \n";
    }
   
    public void setArrowsPainting(boolean active){
        painter.childrenOn=active;
        repaint();
    }
    public boolean getArrowsPainting(){
        return painter.childrenOn;
    }
    public void setArrowsColor(Color c){
        painter.q(c);
        repaint();
    }

    @Override
    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);
        if(enabled){addMouseListener(ML);}
        else{removeMouseListener(ML);}
    }
   
   
   
   
    boolean isArrowsHorizontal(){
        if(w>=h){
            if(isReversingPaintMode){return false;}
            else{return true;}
        }
        else{
            if(isReversingPaintMode){return true;}
            else{return false;}
        }
    }
    void resizedArrows4Tf(){
        w=getWidth();
        h=getHeight();
        pDown.reset();
        pLeft.reset();
        pRight.reset();
        pUp.reset();
       
       
        wd2=w/2;
        hd2=h/2;
        wd3=w/3;
        wd32=wd3*2;
        hd3=h/3;
        hd32=hd3*2;

        if(w>=h){
            if(isReversingPaintMode){resetingPaintModeVertical();}
            else{resetingPaintModeHorizontal();}
        }
        else{
            if(isReversingPaintMode){resetingPaintModeHorizontal();}
            else{resetingPaintModeVertical();}
        }
    }
    void movedArrows4Tf(){}
    void shownArrows4Tf(){}
    void hiddenArrows4Tf(){}
   
    void resetingPaintModeHorizontal(){
        pDown.moveTo(wd2, h);
        pDown.lineTo(wd3, hd2);
        pDown.lineTo(wd32,hd2);
        pDown.closePath();

        pUp.moveTo(wd2, 0);
        pUp.lineTo(wd32, hd2-1);
        pUp.lineTo(wd3,hd2-1);
        pUp.closePath();

        pLeft.moveTo(0, hd2);
        pLeft.lineTo(wd3, h);
        pLeft.lineTo(wd3,0);
        pLeft.closePath();

        pRight.moveTo(w, hd2);
        pRight.lineTo(wd32, 0);
        pRight.lineTo(wd32,h);
        pRight.closePath();       
    }
    void resetingPaintModeVertical(){
        pDown.moveTo(wd2, h);
        pDown.lineTo(w, hd32);
        pDown.lineTo(0,hd32);
        pDown.closePath();

        pUp.moveTo(wd2, 0);
        pUp.lineTo(0, hd3);
        pUp.lineTo(w,hd3);
        pUp.closePath();

        pLeft.moveTo(0, hd2);
        pLeft.lineTo(wd2-1,hd32);
        pLeft.lineTo(wd2-1,hd3);
        pLeft.closePath();

        pRight.moveTo(w, hd2);
        pRight.lineTo(wd2, hd3);
        pRight.lineTo(wd2,hd32);
        pRight.closePath();       
    }
   
   
   
   
   
   
         
    int getDir4(int ex,int ey){
        if(isArrowsHorizontal()){//System.out.println("Arrows are horizontal");
            if(ex>wd32){//System.out.println("Right");
                return swRight4;
            }
            else if(ex<wd3){//System.out.println("Left");
                return swLeft2;
            }
            else{
                if(ey<hd2){//System.out.println("Up");
                    return swUp1;
                }
                else{//System.out.println("Down");
                    return swDown3;
                }
            }
        }
        else{//System.out.println("Arrows are vertical");
            if(ey>hd32){//System.out.println("Down");
                return swDown3;
            }
            else if(ey<hd3){//System.out.println("Up");
                return swUp1;
            }
            else{
                if(ex<wd2){//System.out.println("Left");
                    return swLeft2;
                }
                else{//System.out.println("Right");
                    return swRight4;
                }
            }
        }
    }
    void clickedArrows4Tf(MouseEvent e){}
    void pressedArrows4Tf(MouseEvent e){
       
        int but=e.getButton();
        Dmtn buttonNode=buttons.abn(but);
        if(buttonNode!=null){
            multiplier=buttonNode.dmtn(0).i();
           
            int ex=e.getX();
            int ey=e.getY();
            pressedDir4=getDir4(ex, ey);
            draggedDir4=pressedDir4;


            isShiftDown=e.isShiftDown();///means NO MULTIPLIER AT ALL ..ONE
            //System.out.println("Pressed "+swStr[pressedDir4]+" mult="+multiplier);

            unicMouseTimeMover.works.crad(this);
            unicMouseTimeMover.interrupt();
            addKeyListener(KL);
            addMouseMotionListener(MML);
        }
        //else{System.out.println("This button is not installed");}
   
    }
    void releasedArrows4Tf(MouseEvent e){
        draggedDir4=0;
        removeMouseMotionListener(MML);
        removeKeyListener(KL);
    }
    void enteredArrows4Tf(MouseEvent e){
        if(!arrowsAlwaysOn){setArrowsPainting(true);}
    }
    void exitedArrows4Tf(MouseEvent e){
        if(!arrowsAlwaysOn){setArrowsPainting(false);}
    }
    void draggedArrows4Tf(MouseEvent e){
       
        isShiftDown=e.isShiftDown();///means NO MULTIPLIER AT ALL ..ONE
       
        int refresh=getDir4(e.getX(), e.getY());
        if(refresh!=draggedDir4){
            draggedDir4=refresh;
            //System.out.println("Dir changed to "+swStr[draggedDir4]);
        }
       
    }
   
    void movedArrows4Tf(MouseEvent e){}
   
   
   
         


    void valuesChanged0(){
        refreshText();
        xyChanged();
    }
    boolean cutTextToLong=false;
    public String getPointText(){
        if(cutTextToLong){return (long)val.x+","+(long)val.y;}
        else{return val.x+","+val.y;}
    }
    void refreshText(){
        setText(getPointText());           
    }


    void klcheckingOneByShift(KeyEvent e) {
        isShiftDown=e.isShiftDown();
    }

   

    void beep(){
        Manager.beep();
    }

    void applyAgainCurrDirectionToPoint(){
        //System.out.println("Going "+swStr[draggedDir4]);
        if(draggedDir4==swDown3){
            temp.y=val.y;
            if(isShiftDown){temp.y+=one;}
            else{temp.y+=stepAbs.y*multiplier;}
            if(temp.y>max.y){beep();}
            else{setyNoCheck(temp.y);}
        }
        else if(draggedDir4==swLeft2){
            temp.x=val.x;
            if(isShiftDown){temp.x-=one;}
            else{temp.x-=stepAbs.x*multiplier;}
            if(temp.x<min.x){beep();}
            else{setxNoCheck(temp.x);}
        }
        else if(draggedDir4==swRight4){
            temp.x=val.x;
            if(isShiftDown){temp.x+=one;}
            else{temp.x+=stepAbs.x*multiplier;}
            if(temp.x>max.x){beep();}
            else{setxNoCheck(temp.x);}
        }
        else if(draggedDir4==swUp1){
            temp.y=val.y;
            if(isShiftDown){temp.y-=one;}
            else{temp.y-=stepAbs.y*multiplier;}
            if(temp.y<min.y){beep();}
            else{setyNoCheck(temp.y);}           
        }
        //else{System.out.println("error 0...expecting 1,2,3,4");}
    }   
   
   
   
   
   
}

Δεν υπάρχουν σχόλια: