Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    95

    [Swing] JEditorPane (e nn solo) ke fa i capricci...

    ciao a tutti
    sto realizzando un'applicazione in Java e sto usando la Swing...

    ho realizzato un classe ke estende jpanel ("PanelLayer") e visualizza, attraverso il metodo paintComponent(), la griglia (quella ke nell'immagine ha lo sfondo verde), e deve contenere un'altra classe ("Layer",ke estende sempre jpanel) ke rappresenta il foglio ke,a sua volta, deve contenere un'area di testo (appunto un JEditorPane proprio xkè deve supportare diversi font)...

    il problema, cm si può notare dall'immagine, è che per vedere bene la jeditorpane (e nn solo dato ke ho provato a sostituirlo con una jtextarea ma dà lo stesso problema) devo tener in movimento il mouse.....

    ecco i codici delle due classi:

    codice:
    //x brevità nn ho messo gli import
    
    public class Layer extends JPanel implements ComponentListener{
    
    	private static final long serialVersionUID = 1L;
    	
    	private Rectangle2D.Double areaCentrale = new Rectangle2D.Double(100,100,850,1285);
    	private double larghFoglio = 21.0*50;
    	private double altFoglio = 29.7*50;
    	private double zoom = 1.0;
    	private JScrollPane sp = new JScrollPane(this);
    	private Rectangle2D.Double posFoglio = new Rectangle2D.Double();
    	private int lastX,lastY;
    	private PanelLayer pl;
    	private Point mouse = null;
    	private JEditorPane text;
    	
    	
    	public Layer(PanelLayer pl){
    		this.setLayout(null);
    		this.pl = pl;
    		this.setPreferredSize(new Dimension((int)(40+larghFoglio*zoom), (int)(100+altFoglio*zoom)));
    		areaCentrale = new Rectangle2D.Double(100*zoom,100*zoom,850*zoom,1285*zoom);
    		
    			sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    		sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    		
    		//try{
    			text = new JEditorPane();
    			text.setBounds(50,50,200,200);
    			this.add(text);
    		//}catch(IOException e){}
    		
    		
    		lastX = sp.getHorizontalScrollBar().getValue();
    		lastY = sp.getVerticalScrollBar().getValue();
    		this.addComponentListener(this);
    		this.addMouseListener(this);
    		this.addMouseMotionListener(this);
    		
    	}
    	public void paintComponent(Graphics g){
    		if(posFoglio.height + posFoglio.width == 0){
    			this.posFoglio = new Rectangle2D.Double((this.getWidth()-larghFoglio*zoom)/2,50,larghFoglio*zoom,altFoglio*zoom);		
    		}
    		
    		Graphics2D g2d = (Graphics2D)g;
    		
    		g2d.setPaint(Color.lightGray);
    		g2d.fillRect(0,0,this.getWidth(),this.getHeight());
    		
    		g2d.translate((this.getWidth()-larghFoglio*zoom)/2,50);
    		
    		g2d.setPaint(Color.black);
    		g2d.draw(new Rectangle2D.Double(0,0,larghFoglio*zoom,altFoglio*zoom));
    		
    		g2d.setPaint(Color.white);
    		g2d.fill(new Rectangle2D.Double(1,1,larghFoglio*zoom-1,altFoglio*zoom-1));
    		
    		g2d.setPaint(Color.blue);
    		g2d.draw(areaCentrale);
    	}
    	public JScrollPane getJScrollPane(){
    		return sp;
    	}
    	public Rectangle2D.Double getDimFoglio(){		
    		return this.posFoglio;
    	}
    
    	public double getCmWidth(){
    		return larghFoglio*zoom/50+((larghFoglio*zoom/50)%1 <= getIncr() ? 0 : getIncr());
    	}
    	public double getCmHeight(){
    		return altFoglio*zoom/50+((altFoglio*zoom/50)%1 <= getIncr() ? 0 : getIncr());
    	}
    	public Point getPointMouse(){
    		return mouse;
    	}
    	public void refresh(){
    		lastX = sp.getHorizontalScrollBar().getValue();
    		posFoglio.x = (this.getWidth()-larghFoglio*zoom)/2-lastX;
    	}
    	public double getIncr(){
    		return zoom/2;
    	}
    	public void mouseClicked(MouseEvent e) {}
    	public void mouseEntered(MouseEvent e) {}
    	public void mouseExited(MouseEvent e) {}
    	public void mousePressed(MouseEvent e) {}
    	public void mouseReleased(MouseEvent e) {}
    	public void mouseDragged(MouseEvent e) {}
    
    	public void mouseMoved(MouseEvent e) {
    		mouse = e.getPoint();
    		mouse.x -= sp.getHorizontalScrollBar().getValue();
    		mouse.y -= sp.getVerticalScrollBar().getValue();
    		pl.repaint();
    	}
    	
    	public void componentHidden(ComponentEvent e) {}
    	public void componentMoved(ComponentEvent e) {
    		lastX = sp.getHorizontalScrollBar().getValue();
    		posFoglio.x = (this.getWidth()-larghFoglio*zoom)/2-lastX;
    		
    		lastY = sp.getVerticalScrollBar().getValue();
    		posFoglio.y = 50-lastY;
    		
    		pl.repaint();
    	}
    	public void componentResized(ComponentEvent e) {
    		this.repaint();
    		pl.repaint();
    	}
    	public void componentShown(ComponentEvent e) {}
    }
    
    public class PanelLayer extends JPanel implements MouseWheelListener,MouseInputListener{
    
    	private static final long serialVersionUID = 1L;
    	private Layer layer;
    	private JScrollPane sp = null;
    	private boolean visualizzaMouse = false;
    	
    	public PanelLayer(){
    		this.setLayout(null);
    		layer = new Layer(this);
    		layer.addMouseListener(this);
    		layer.addMouseMotionListener(this);
    	}
    	
    	public void paintComponent(Graphics g){
    		if(layer.getDimFoglio().getWidth()+layer.getDimFoglio().getHeight() == 0){
    			layer.setSize(50,50);
    		}
    		if(sp == null){
    			sp = layer.getJScrollPane();
    			sp.addMouseWheelListener(this);
    			sp.setBounds(30,30,this.getWidth()-30,this.getHeight()-30);
    			this.add(sp);
    		}else{
    			layer.refresh();
    		}
    		sp.setBounds(30,30,this.getWidth()-30,this.getHeight()-30);
    		
    		Graphics2D g2d = (Graphics2D)g;
    		
    		g2d.setPaint(new Color(153,255,153));
    		g2d.fill(new Rectangle2D.Double(0,0,this.getWidth(),30));
    		g2d.fill(new Rectangle2D.Double(0,0,30,this.getHeight()));
    		
    		g2d.setPaint(Color.black);
    		g2d.drawLine(0,0,this.getWidth(),0);
    		g2d.drawLine(0,30,this.getWidth(),30);
    		g2d.drawLine(0,0,0,this.getHeight());
    		g2d.drawLine(30,0,30,this.getHeight());
    		
    		for(double i=0,j=0;i<=layer.getCmWidth();i+=layer.getIncr(),j++){
    			if(j%2==0){
    				g2d.drawLine((int)(layer.getDimFoglio().x+31+i*50), 15,(int)(layer.getDimFoglio().x+31+i*50), 30);
    				g2d.drawString(String.valueOf((int)(j/2)), (float)(layer.getDimFoglio().x+31+i*50), 13);				
    			}else{
    				g2d.drawLine((int)(layer.getDimFoglio().x+31+i*50), 22,(int)(layer.getDimFoglio().x+31+i*50), 30);
    			}
    		}
    		for(double i=0,j=0;i<=layer.getCmHeight();i+=layer.getIncr(),j++){
    			if(j%2==0){
    				g2d.drawLine(15, (int)(layer.getDimFoglio().y+31+i*50),30,(int)(layer.getDimFoglio().y+31+i*50));
    				g2d.drawString(String.valueOf((int)(j/2)),5,(float)(layer.getDimFoglio().y+31+i*50));
    			}else{
    				g2d.drawLine(22, (int)(layer.getDimFoglio().y+31+i*50),30,(int)(layer.getDimFoglio().y+31+i*50));
    			}
    		}
    		
    		if((layer.getPointMouse() != null)&&(visualizzaMouse)){
    			g2d.drawLine(layer.getPointMouse().x+30,0,layer.getPointMouse().x+30,30);
    			g2d.drawLine(0,layer.getPointMouse().y+30,30,layer.getPointMouse().y+30);
    		}
    		
    		g2d.setPaint(new Color(153,255,153));
    		g2d.fillRect(1,1,29,29);
    		int largh = layer.getJScrollPane().getVerticalScrollBar().getWidth();
    		g2d.fillRect(this.getWidth()-largh, 1, largh, 29);
    		g2d.fillRect(1, this.getHeight()-largh, 29, largh);
    	}
    	public void mouseWheelMoved(MouseWheelEvent e) {
    		JScrollBar vsb = layer.getJScrollPane().getVerticalScrollBar();
    		vsb.setValue(vsb.getValue()+20*e.getWheelRotation());
    	}
    	public void refresh(){
    		if((layer != null)&&(sp != null)){
    			layer.setSize(this.getWidth()-30,this.getHeight()-30);
    			sp.setViewportView(layer);
    			this.repaint();
    		}
    	}
    
    	public void mouseClicked(MouseEvent e) {}
    	public void mouseEntered(MouseEvent e) {
    		visualizzaMouse = true;
    		repaint();
    	}
    	public void mouseExited(MouseEvent e) {
    		visualizzaMouse = false;
    		repaint();
    	}
    	public void mousePressed(MouseEvent e) {}
    	public void mouseReleased(MouseEvent e) {}
    	public void mouseDragged(MouseEvent e) {}
    	public void mouseMoved(MouseEvent e) {}
    }

    accetto qualsiasi consiglio...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Swing] JEditorPane (e nn solo) ke fa i capricci...

    Originariamente inviato da av89
    accetto qualsiasi consiglio...
    Credo che la strada che hai intrapreso (disegnare i righelli nel pannello) non sia quella migliore. Bisognerebbe sfruttare meglio il JScrollPane. Leggi qui sul tutorial ufficiale della Sun:

    Providing Custom Decorations

    dove spiega come aggiungere delle decorazioni custom al JScrollPane.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    95
    ho visto il tutorial.... però voglio risolvere prima il vero problema e poi pensare al righello....

    qualke idea??

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.