Domanda

Ho un problema. Ho usato GridBagLayout nel mio JFrame. Uno dei componenti è JPanel.

Ho voluto disegnare una griglia come sfondo per le mie JPanel. per esempio nel programma seguente, si suppone di produrre 3 verticale e 3 linee orizzontali, ma mostra solo 2 verticale e 2 linea orizzontale. l'ultima riga non è stato dimostrato.

Un altro problema era che, sembra che la dimensione del JPanel era più grande che quello che ho impostato. Ho notato che questo per la lunghezza della linea che è più breve che lo sfondo bianco JPanel.

  public class drawLayout extends JComponent 
    {

 public Dimension getPreferredSize() { 
  return new Dimension(600, 600); 
 }

 public int getY() { 
  return 0; 
 } 

 public int getX() { 
   return 0; 
    }

    @Override public void paintComponent(Graphics g)
    {
     g.setPaint(Color.GRAY);

            for (int i = 0; i <= getSize().width; i += 300) 
            {
               g2.drawLine(i, 0, i, getSize().height);
            }

            for (int i = 0; i <= getSize().height; i += 300) 
            {
               g2.drawLine(0,i, getSize().width, i);
            }
    } 
}

EDIT:

http://www.freeimagehosting.net/image.php?1af16edc28.jpg

Il primo problema risolto (le griglie sono state indicate JPanel). L'altro problema mi ha sconcertato. Come si può vedere l'immagine allegata, la dimensione del JPanel sembra essere più di 600, quando un'occhiata alla lunghezza della rete (contrassegnato come riquadro rosso). Come posso risolvere questo in modo che il fondo griglia aspetto gradevole senza spazi vuoti al di fuori della griglia?

È stato utile?

Soluzione

Se la dimensione dei vostri JPanel è 600, quindi le sue coordinate disponibili solo andare da 0 a 599. La linea 600 non sta per essere disegnato.

Inoltre, qualsiasi bordo e / o inserti ridurrebbero ulteriormente lo spazio a disposizione.

Aggiornamento: Ho avuto un po 'di tempo, così ho scritto la vostra applicazione. Speriamo che troverete alcuni suggerimenti utili.

public class Jessy extends JFrame {

   private static final int DRAWING_SIZE = 600;
   private static final int SUBDIVISIONS = 2;
   private static final int SUBDIVISION_SIZE = DRAWING_SIZE / SUBDIVISIONS;

   public Jessy() {
      setSize(800, 800);
      setLayout(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.weightx = 1.0;
      gbc.weighty = 1.0;
      gbc.gridx = 0;
      gbc.gridy = 0;
      JLabel drawingBoard = new JLabel("Drawing Board");
      gbc.anchor = GridBagConstraints.SOUTH;
      drawingBoard.setFont(new Font("Serif", Font.BOLD, 28));
      add(drawingBoard, gbc);
      JPanel panel = new JPanel() {
         @Override public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setPaint(Color.GRAY);
            for (int i = 1; i < SUBDIVISIONS; i++) {
               int x = i * SUBDIVISION_SIZE;
               g2.drawLine(x, 0, x, getSize().height);
            }
            for (int i = 1; i < SUBDIVISIONS; i++) {
               int y = i * SUBDIVISION_SIZE;
               g2.drawLine(0, y, getSize().width, y);
            }
         }          
      };
      panel.setPreferredSize(new Dimension(DRAWING_SIZE, DRAWING_SIZE));
      panel.setBackground(Color.WHITE);
      panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
      gbc.gridy++;
      gbc.anchor = GridBagConstraints.CENTER;
      add(panel, gbc);
      JButton saveDrawing = new JButton("SAVE DRAWING");
      gbc.gridy++;
      gbc.anchor = GridBagConstraints.NORTH;
      add(saveDrawing, gbc);
   }
   public static void main(String[] args) {
      (new Jessy()).setVisible(true);
   }
}

Alcuni dettagli:

  • ho usato un bordo per le linee esterne, questo ci fa risparmiare un po 'di problemi con il "599".
  • I presume che volevi una griglia suddivisa al suo interno in modo da ho aggiunto un po 'di impianto idraulico per fare quel flessibile e configurabile.
  • Ho notato il vostro paintComponents() non chiama super.paintComponents(). Si dovrebbe!
  • Ho usato quello che penso di essere il minimo richiesto di codifica per specificare i vincoli GridBag. Meno di codifica = meno bug:)
  • I sottoclasse un JPanel (in accordo con quello che hai scritto), piuttosto che un JComponent (in accordo con ciò che è nel codice). La differenza sembra essere che JComponent non è in grado di disegnare il suo sfondo, in modo che finì grigio.
  • Forse ancora più importante, ho misurato la mia GUI con kruler: Il componente disegno è esattamente 600 in termini di dimensioni entrambi i modi! :)

Altri suggerimenti

Si sono incrementando i da 300. Dopo due itterations, i è 600, e si esce dal ciclo for. Provare a impostare le vostre dimensioni di 601 o incremento in base al 299. È inoltre possibile utilizzare la larghezza e l'altezza + 1 + 1 nel confronto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top