Pregunta

Tengo un problema.He utilizado Gridbaglayout en mi JFrame.Uno de los componente JPanel.

Yo quería dibujar una línea de la cuadrícula como fondo para mi JPanel.e.g en el siguiente programa, se supone que para producir 3 verticales y 3 horizontales líneas, sin embargo, sólo muestra 2 verticales y 2 horizontales de la línea.la última línea no fue demostrado.

Otro problema es que, parece que el tamaño de la JPanel era más grande que lo que he puesto.Me di cuenta de esto por la longitud de la línea, que es más corto que el JPanel fondo blanco.

  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);
            }
    } 
}

EDITAR:

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

El primer problema resuelto (las líneas de la cuadrícula se muestra en JPanel).El otro problema me desconcertó.Como se puede ver en la imagen adjunta, el tamaño de la JPanel parece ser más de 600 cuando se mira en la longitud de la rejilla (marcado como un cuadro rojo).¿Cómo puedo solucionar esto para que la cuadrícula de fondo se ven bien sin ningún espacio en blanco fuera de la grilla?

¿Fue útil?

Solución

Si el tamaño de su JPanel es 600, entonces sus coordenadas disponibles sólo van de 0 a 599. La línea 600 no va a ser dibujado.

Además, cualquier fronteras y / o inserciones reducirían aún más el espacio disponible.

Actualización: Tenía algo de tiempo, así que escribí su aplicación. Esperamos que pueda encontrar algunos consejos útiles.

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);
   }
}

Algunos detalles:

  • I utiliza una frontera para las líneas exteriores, esto nos ahorra un poco de problemas con "599".
  • I asumió que quería una rejilla subdividido en el interior por lo que añade algo de plomería para hacer que flexible y configurable.
  • Me di cuenta de que su paintComponents() no llama super.paintComponents(). Se debe!
  • utilicé lo que creo que es el mínimo requerido de codificación para especificar las restricciones GridBag. Menos de codificación = menos errores:)
  • I subclases un JPanel (de acuerdo con lo que ha escrito) en lugar de un JComponent (de acuerdo con lo que hay en su código). La diferencia parece ser que JComponent no es capaz de dibujar su plano, por lo que acabó gris.
  • Tal vez lo más importante, Medí mi GUI con kruler: El componente de dibujo es exactamente 600 en tamaño en ambos sentidos! :)

Otros consejos

Se está incrementando i por 300. Después de dos itterations, i es de 600, y se sale del bucle. Intenta establecer sus dimensiones de 601 o incremento por 299. También puede utilizar el ancho y la altura + 1 + 1 en su comparación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top