2016-11-25 3 views
-1

Je travaille sur un programme qui dessine une fonction linéaire basée sur les entrées données par l'utilisateur. J'ai réussi à créer une méthode qui dessine la "ligne" (plusieurs points).Java, dessine sur un JPanel spécifique

Comme vous pouvez le voir sur la capture d'écran, il y a de l'espace sur le côté droit. Je voudrais ajouter quelques JButtons, JLabels et JTextFields afin que l'utilisateur puisse entrer les données pour la fonction.

Screenshot of the program

Mais si j'ajoute quelques JButton ou quelques JLabels, ils ne seront pas affichés sur le côté droit. Quelqu'un peut-il m'expliquer la raison de ce comportement? Je vais télécharger le code source de la version sans les JButtons. Merci les gars pour votre aide!

package projekt; 

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

public class ProjectFunction extends JFrame { 


    public ProjectFunction() { 


     setLayout(new BorderLayout()); 


     setSize(1900, 1000); 
     setTitle("First Test"); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 


    public void paint(Graphics g){ 
     g.setColor(new Color(204, 204, 204)); 
     g.drawLine(0, 900, 1000, 900); 
     g.drawLine(0, 800, 1000, 800); 
     g.drawLine(0, 700, 1000, 700); 
     g.drawLine(0, 600, 1000, 600); 
     g.drawLine(0, 400, 1000, 400); 
     g.drawLine(0, 300, 1000, 300); 
     g.drawLine(0, 200, 1000, 200); 
     g.drawLine(0, 100, 1000, 100); 
     g.drawLine(100, 0, 100, 1000); 
     g.drawLine(200, 0, 200, 1000); 
     g.drawLine(300, 0, 300, 1000); 
     g.drawLine(400, 0, 400, 1000); 
     g.drawLine(600, 0, 600, 1000); 
     g.drawLine(700, 0, 700, 1000); 
     g.drawLine(800, 0, 800, 1000); 
     g.drawLine(900, 0, 900, 1000); 
     g.setColor(Color.BLACK); 
     g.drawRect(0, 500, 1000, 1); 
     g.drawRect(500, 0, 1, 1000); 
     g.setColor(Color.RED); 
     linear(0.25, 1, g); 
     g.setColor(Color.BLUE); 
     linear(-3, -2.5, g); 

    } 


    public void linear(double s, double c, Graphics g) { 
     int Anzpunkte = 0; 
     c = c * 100; 
     int x = 500, y = 500 - (int) c; 
     g.drawOval(x, y, 2, 2); 
     y = y - (int) s; 
     double abtrag = s - (int) s; 
     System.out.println("Punkt X-Achse Y-Achse Abtrag Steigung"); 
     Anzpunkte++; 
     System.out.println("" + Anzpunkte + "  " + x + "  " + y + "  " + abtrag + " " + s); 
     while (x < 1000 && y < 1000 && x > 0 && y > 0) { 
      x++; 
      g.drawOval(x, y, 2, 2); 
      Anzpunkte++; 
      System.out.println("" + Anzpunkte + "  " + x + "  " + y + "  " + abtrag + " " + s); 
      if (abtrag >= 1 || abtrag <= -1) { 
       y = y - (int) s; 
       y = y - (int) abtrag; 
       abtrag = s - (int) s; 
      } else { 
       y = y - (int) s; 
       abtrag = abtrag + s - (int) s; 
      } 
     } 
     x = 500; 
     y = 500 - (int) c; 
     while (x < 1000 && y < 1000 && x > 0 && y > 0) { 
      x--; 
      g.drawOval(x, y, 2, 2); 
      Anzpunkte++; 
      System.out.println("" + Anzpunkte + "  " + x + "  " + y + "  " + abtrag + " " + s); 
      if (abtrag >= 1 || abtrag <= -1) { 
       y = y + (int) s; 
       y = y + (int) abtrag; 
       abtrag = s - (int) s; 
      } else { 
       y = y + (int) s; 
       abtrag = abtrag + s - (int) s; 
      } 
     } 


    } 


    public static void main(String[] args) { 
     ProjectFunction p = new ProjectFunction(); 


    } 

} 
+0

Il n'y a pas de code qui ajoute un bouton ou un composant d'étiquette n'importe où dans ce que vous avez posté. –

+0

Bienvenue dans Stack Overflow! Veuillez consulter notre [Liste de questions sur les questions de sécurité] (http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist) pour vous aider à poser une bonne question et obtenir ainsi une bonne réponse. –

Répondre

2

Si vous souhaitez ajouter des boutons à droite, vous allez vouloir apprendre et utiliser les gestionnaires de disposition. Un concept clé est que vous pouvez effectivement imbriquer des mises en page en imbriquant JPanels, chacun utilisant sa propre mise en page. Par exemple, si nous avons fait notre dessin dans un JPanel (et ceci est recommandé de faire plutôt que de dessiner directement dans un JFrame, nous pouvons placer ce JPanel dans un autre JPanel qui utilise BorderLayout dans la position BorderLayOut.CENTER.Nous pouvons ensuite ajouter un autre JPanel qui utilise GridLayout pour ajouter des boutons sur le côté droit de ce JPanel extérieur

peut-être qu'il est préférable de simplement montrer un exemple:.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GridLayout; 

import javax.swing.*; 

public class ProjectFunctionTest { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      JFrame mainFrame = new JFrame("Project Function"); 
      mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      mainFrame.add(new ProjFunctMainPanel()); 
      mainFrame.pack(); 
      mainFrame.setLocationRelativeTo(null); 
      // mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
      mainFrame.setVisible(true); 
     }); 
    } 
} 

class ProjFunctMainPanel extends JPanel { 
    private static final String[] BUTTON_TEXTS = {"Open", "Save", "Edit", "Exit"}; 
    private ProjFunctDrawingPanel drawingPanel = new ProjFunctDrawingPanel(); 

    public ProjFunctMainPanel() { 
     // an inner jpanel to hold our jbuttons and uses grid layout 
     JPanel buttonPanel = new JPanel(new GridLayout(0, 1, 5, 5)); 
     for (String btnText : BUTTON_TEXTS) { 
      buttonPanel.add(new JButton(btnText)); 
     } 

     // a wrapper jpanel to hold the button panel above at its top 
     // so the buttons are loaded top-right 
     JPanel rightPanel = new JPanel(new BorderLayout()); 
     rightPanel.add(buttonPanel, BorderLayout.PAGE_START); 

     // make outer panel use borderlayout 
     setLayout(new BorderLayout()); 
     add(drawingPanel, BorderLayout.CENTER); // add drawing to the center 
     add(rightPanel, BorderLayout.LINE_END); // and wrapper panel with buttons to the right 
    } 
} 

class ProjFunctDrawingPanel extends JPanel { 
    private static final int PANEL_W = 1000; 
    private static final int PANEL_H = 900; 

    public ProjFunctDrawingPanel() { 
     setBorder(BorderFactory.createLineBorder(Color.BLUE)); 
    } 

    // this will set the preferred size of the jpanel to be one that fits the image 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize();    
     } else { 
      return new Dimension(PANEL_W, PANEL_H); 
     } 
    } 

    // draw in a JPanel's paintComponent method 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); // don't forget to call the super's method 
     g.setColor(new Color(204, 204, 204)); 
     g.drawLine(0, 900, 1000, 900); 
     g.drawLine(0, 800, 1000, 800); 
     g.drawLine(0, 700, 1000, 700); 
     g.drawLine(0, 600, 1000, 600); 
     g.drawLine(0, 400, 1000, 400); 
     g.drawLine(0, 300, 1000, 300); 
     g.drawLine(0, 200, 1000, 200); 
     g.drawLine(0, 100, 1000, 100); 
     g.drawLine(100, 0, 100, 1000); 
     g.drawLine(200, 0, 200, 1000); 
     g.drawLine(300, 0, 300, 1000); 
     g.drawLine(400, 0, 400, 1000); 
     g.drawLine(600, 0, 600, 1000); 
     g.drawLine(700, 0, 700, 1000); 
     g.drawLine(800, 0, 800, 1000); 
     g.drawLine(900, 0, 900, 1000); 
     g.setColor(Color.BLACK); 
     g.drawRect(0, 500, 1000, 1); 
     g.drawRect(500, 0, 1, 1000); 
     g.setColor(Color.RED); 
     linear(0.25, 1, g); 
     g.setColor(Color.BLUE); 
     linear(-3, -2.5, g); 
    } 

    public void linear(double s, double c, Graphics g) { 
     int Anzpunkte = 0; 
     c = c * 100; 
     int x = 500, y = 500 - (int) c; 
     g.drawOval(x, y, 2, 2); 
     y = y - (int) s; 
     double abtrag = s - (int) s; 
     System.out.println("Punkt X-Achse Y-Achse Abtrag Steigung"); 
     Anzpunkte++; 
     System.out.println("" + Anzpunkte + "  " + x + "  " + y + "  " + abtrag + " " + s); 
     while (x < 1000 && y < 1000 && x > 0 && y > 0) { 
      x++; 
      g.drawOval(x, y, 2, 2); 
      Anzpunkte++; 
      System.out.println("" + Anzpunkte + "  " + x + "  " + y + "  " + abtrag + " " + s); 
      if (abtrag >= 1 || abtrag <= -1) { 
       y = y - (int) s; 
       y = y - (int) abtrag; 
       abtrag = s - (int) s; 
      } else { 
       y = y - (int) s; 
       abtrag = abtrag + s - (int) s; 
      } 
     } 
     x = 500; 
     y = 500 - (int) c; 
     while (x < 1000 && y < 1000 && x > 0 && y > 0) { 
      x--; 
      g.drawOval(x, y, 2, 2); 
      Anzpunkte++; 
      System.out.println("" + Anzpunkte + "  " + x + "  " + y + "  " + abtrag + " " + s); 
      if (abtrag >= 1 || abtrag <= -1) { 
       y = y + (int) s; 
       y = y + (int) abtrag; 
       abtrag = s - (int) s; 
      } else { 
       y = y + (int) s; 
       abtrag = abtrag + s - (int) s; 
      } 
     } 
    } 
} 

une note sur le dessin: vous ne voulez jamais dessiner directement dans le JFrame comme Les JFrames sont des composants graphiques complexes qui contiennent, affichent et peignent plusieurs composants, et dessiner dans sa méthode de peinture risque de gâcher cette fonctionnalité, de ne pas avoir de méthode paintComponent et donc de perdre automatiquement double buffering matic qui est important si vous faites de l'animation. Au lieu de cela, dessinez dans la méthode paintComponent d'un JPanel et appelez la méthode du super dans votre override afin que la peinture d'entretien puisse être faite.

1

Vous surchargez paint(...) sans appel à super.paint(g) où les composants du cadre sont dessinés. Et si vous l'appelez en premier et dessinez vos lignes après, vous pouvez juste dessiner sur les composants. Votre prochain problème sera la mise en page. Si vous n'utilisez pas un générateur GUI (que je ne recommanderais pas parce que je suis un puriste; P), vous devrez gérer une mise en page appropriée et je pense qu'il est conseillé de ne pas placer le tiroir de ligne dans le JFrame lui-même mais dans un JPanel qui sera mis dans le JFrame. Je recommande aussi le GridBagLayout, mais vous me détestez probablement pour cela, car il est un peu sophistiqué.

Et si vous utilisez un constructeur GUI ... aucune idée, je n'ai jamais fait.

1

il y a de l'espace sur le côté droit. Je voudrais ajouter quelques JButtons, JLabels et JTextFields afin que l'utilisateur puisse entrer les données pour la fonction.

Alors en vous votre cadre, vous devez ajouter deux panneaux séparés au châssis:

  1. le premier panneau où vous faites la peinture personnalisée. Vous remplacez paintComponent(..) pour cette peinture.

  2. le deuxième panneau contiendra vos composants

Ainsi, le code de base serait:

JFrame frame = new JFrame(...); 
frame.add(new PaintingPanel(), BorderLayout.CENTER); 
frame.add(new ComponentPanel(), BorderLayout.LINE_END); 

Ne pas faire de la peinture personnalisée directement sur le cadre.

Lisez la section du tutoriel Swing sur la peinture personnalisée pour plus d'informations et des exemples de travail.

+0

Une meilleure réponse que la mienne et plus courte. 1+ –

+0

Qui a voté cette réponse? –