Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Ridimensionamento JPanel in base alla dimensione del Frame

    Ho un problema, ho un frame con all'interno una JMenuBar, una JToolBar e un JSplitPane. Nel JSplitPane nella parte superiore ho un JPanel su cui disegno. Il mio scopo era quello che in base alla dimensione del JPanel dovesse disegnare questa griglia, soltanto che quando ridimensiono il frame ovviamente la griglia rimane bianca su alcuni lati, come posso risolvere??

    Inoltre volevo che il mio JSplitPane nel momento in cui ridimensionavo la finestra si ridimensionasse in maniera proporzionale, soltanto che quando provo a mettere un double per dare la percentuale di dove si trova la barra nel metodo setDividerLocation() la barra si porta tutta in alto e si vede solo parte bottom come posso fare???


  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Dipende come disegni le linee. Ogni volta che viene toccato JPanel, questo richiama il metodo paint(). Quindi devi semplicemente far si che tracci le linee a seconda della dimensione.
    In alternativa, eviti di far ridimensionare il frame.

  3. #3
    Si ma non so come fare riferimento al frame dal JPanel in cui disegno, quindi come posso fare?? e poi i componenti del del Frame non hanno una dimensione cioè gliela assegna il LayoutManager che ho impostato cioè il BorderLayout.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Partiamo dall'inizio. Le linee sul pannello come le disegni?

  5. #5
    Ho ridefinito il componentPaint() in questo modo, usando questi metodi all'interno del JPanel

    import java.awt.*;
    import javax.swing.*;

    public class MiddlePanel extends JPanel{

    int paintWidth = 800;
    int paintHeigth = 600;

    public MiddlePanel(){
    this.setLayout(new BorderLayout());
    this.setBackground(Color.white);
    this.setVisible(true);
    }

    @Override
    public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.LIGHT_GRAY);
    setPaintArea(g);
    }

    public void paintGrid(Graphics g){
    for(int i=0;i<this.paintWidth;i+=20){
    g.drawLine(i,0,i,this.paintHeigth);
    g.drawLine(0,i,this.paintWidth,i);
    }
    }

    public void setPaintArea(Graphics g){
    paintGrid(g);
    this.setPreferredSize(new Dimension(paintWidth+5,paintHeigth+5));
    }

    public int getPaintWidth(int Width){
    if(paintWidth<Width)
    paintWidth = Width;
    return Width;
    }

    public int getPaintHeigth(int Heigth){
    if(paintHeigth<Heigth)
    paintHeigth = Heigth;
    return Heigth;
    }
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ridefinire paintComponent() è corretto.
    Ma non sarebbe più semplice fare così?

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    class MiddlePanel extends JPanel {
      
      MiddlePanel() {
        super(new BorderLayout());
      }
      
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        Graphics2D g2 = (Graphics2D) g;
        
        int width = getWidth();
        int height = getHeight();
    
        for(int i=0; i<width; i+=20) {
          g.drawLine(i,0,i,height);
          g.drawLine(0,i,width,i);
        }
      }
    }
    
    class FrameExample extends JFrame {
      private MiddlePanel mp;
      
      FrameExample() {
        mp = new MiddlePanel();
        add(mp);
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
      
      public static void makeGUI() {
        FrameExample fe = new FrameExample();
        fe.setSize(800,600);
        fe.setVisible(true);
      }
      
      public static void main(String[] args) {
        try {
          SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
              makeGUI();
            }
          });
        } catch(Exception e) {}
      }
    }

  7. #7
    OK grazie infinite!! Ora funziona solo un paio di domande:
    Perchè hai creato un oggetto di tipo "Graphics2D g2 = (Graphics2D) g;"??
    E perchè hai passato al super un layout "super(new BorderLayout())"??
    Infine se io volessi espandere questa griglia in funzione di quello che disegno ad esempio disegnandoci delle porte logiche al bordo del frame, come dovrei fare per fargli disegnare un altro pezzo di griglia ed eventualmente fare anche un autoscrool portando il mouse nel bordo?
    In ogni caso grazie dell'aiuto

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Perchè hai creato un oggetto di tipo "Graphics2D g2 = (Graphics2D) g;"??
    Abitudine. :P Mette a disposizioni altri metodi Graphics2D (in particolare funzionalità per le forme geometriche).


    E perchè hai passato al super un layout "super(new BorderLayout())"??
    In realtà è inutile in questo caso, puoi lasciare quello di default (che è FlowLayout).
    Se aggiungi dei componenti utilizzando BorderLayout occuperanno l'intera area del pannello (o porzioni specifiche definite dalle costanti di BorderLayout).


    Originariamente inviato da Sassofonix
    Infine se io volessi espandere questa griglia in funzione di quello che disegno ad esempio disegnandoci delle porte logiche al bordo del frame, come dovrei fare per fargli disegnare un altro pezzo di griglia ed eventualmente fare anche un autoscrool portando il mouse nel bordo?
    In ogni caso grazie dell'aiuto
    Diciamo che questo cambia un po' le cose. Puoi fornire un area definita (settando le dimensioni del JPanel con setMinimumSize() e setMaximumSize() più gli altri); puoi porre poi una barra di scorrimento laterale, oppure puoi fare come dici tu. In questo caso devi però sapere dove si trova il mouse (MouseListener offre dei metodi) ed arrivato al bordo mostrare il resto della finestra (anche se pensandoci non mi sembra semplicissimo da realizzare).

  9. #9
    Ci proverò cmq grazie di tutto Se vuoi puoi rispondere ad un'altro post che ho messo nel forum Grazie infinite

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.