Frage

Ich habe ein Problem. Ich habe Gridbaglayout in meinem JFrame verwendet. Eine der Komponenten ist JPanel.

Ich wollte eine Gitterlinie als Hintergrund für mein JPanel zeichnen. z. B. im folgenden Programm soll es 3 vertikale und 3 horizontale Linien erzeugen, es zeigt jedoch nur 2 vertikale und 2 horizontale Linien. Die letzte Zeile wurde nicht gezeigt.

Ein weiteres Problem war, dass die Größe des JPanel größer war als das, was ich gesetzt habe. Ich bemerkte dies durch die Länge der Linie, die kürzer ist als der weiße Hintergrund von 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);
            }
    } 
}

BEARBEITEN:

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

Das erste Problem gelöst (die Gitterlinien wurden auf JPanel gezeigt). Das andere Problem hat mich verwirrt. Wie Sie auf dem angeschlossenen Bild sehen können, scheint die Größe des JPanel mehr als 600 zu betragen, wenn Sie sich die Länge des Gitters ansehen (markiert als roter Box). Wie kann ich dies lösen, damit der Gridline -Hintergrund ohne zusätzlichen Weißraum außerhalb der Gitterlinie gut aussieht?

War es hilfreich?

Lösung

Wenn die Größe Ihres JPanel 600 beträgt, werden die verfügbaren Koordinaten nur von 0 bis 599 erhältlich. Die Linie bei 600 wird nicht gezogen.

Außerdem würden alle Grenzen und/oder Insets den verfügbaren Platz weiter verringern.

Aktualisieren: Ich hatte etwas Zeit, also habe ich Ihre Bewerbung geschrieben. Hoffentlich finden Sie einige nützliche Hinweise.

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

Ein paar Details:

  • Ich habe einen Grenze für die Außenzeilen verwendet, was uns ein bisschen Probleme mit "599" erspart.
  • Ich nahm an, Sie wollten ein unterteiltes Gitter von innen, also fügte ich etwas Klempner hinzu, um dieses flexible und konfigurierbare zu machen.
  • Ich habe deine bemerkt paintComponents() Ruft nicht an super.paintComponents(). Es sollte!
  • Ich habe das verwendet, was ich für das minimal erforderliche Codieren hielt, um die Einschränkungen des Gridbags anzugeben. Weniger Codierung = weniger Fehler :)
  • Ich habe ein JPanel (gemäß dem, was Sie geschrieben haben) und nicht ein JComponent (gemäß dem, was in Ihrem Code ist) unterklebt. Der Unterschied scheint zu sein, dass JComponent nicht in der Lage ist, seinen Hintergrund zu zeichnen, so dass es grau wurde.
  • Am wichtigsten ist vielleicht, dass ich meine GUI mit Kruler gemessen habe: Die Zeichnungskomponente ist genau 600 in beide Richtungen! :)

Andere Tipps

Sie inkrementieren i um 300. Nach zwei ITterations bin ich 600 und Sie beenden die für die Schleife. Versuchen Sie, Ihre Abmessungen auf 601 oder in Erhöhung von 299 zu steigern. Sie können auch die Breite+1 und Höhe+1 in Ihrem Vergleich verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top