2015-10-12 3 views
1

Je suis vraiment frustré parce que l'interface graphique affiche mais pas JSlider! Ok, donc l'interface graphique est censée afficher un cercle, JTextfield (qui se met à jour lorsque le curseur est déplacé). Le champ de texte est censé afficher le rayon, le diamètre, etc. et le mettre à jour automatiquement lorsque le curseur est déplacé. Le cercle est également supposé augmenter en taille ou diminuer une fois que le curseur est déplacé. Voici mon code. Pas d'erreurs, fonctionne bien, et compile. C'est probablement mes coordonnées qui sont éteintes.Pourquoi mon JSlider n'apparaît-il pas dans mon interface graphique Java?

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.WindowAdapter; 
import javafx.stage.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.JTextArea; 
import javax.swing.SwingConstants; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Circle1 extends JFrame 
{ 

    private final CircleCanvas theCanvas; 

    private final JTextArea display; 

    public Circle1() 

    { 

     super("Circle1"); 

     theCanvas = new CircleCanvas(); 

     display = new JTextArea(4, 30); 



     display.setText("The Radius: " + theCanvas.getRadius() + "\nThe Diameter: " + theCanvas.getDiameter() + "\nThe Area: " + theCanvas.getArea() + 

           "\nThe Circumference: " + theCanvas.getCircumference()); 



     getContentPane().add(theCanvas, BorderLayout.CENTER); 

     getContentPane().add(display, BorderLayout.SOUTH); 

     setSize(200, 200); 
     setVisible(true); 

    } 



    public static void main(String args[]) 

    { 

     Circle1 app = new Circle1(); 


     app.addWindowListener(

     new WindowAdapter() 
     { 

      public void WindowClosing(WindowEvent e) 

      { 

      } 
     } 
    ); 
    } 

    void setDiameter(int value) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

} 

class CircleCanvas extends JPanel 
{ 

    private final int radius; 

    public CircleCanvas() 

    { 

     radius = (int)(1 + Math.random() * 100); 

     setSize (100, 100); 

    } 

    @Override 
    public void paintComponent(Graphics g) 

      { g.drawOval(0, 0, radius, radius); } 



    public int getDiameter() 
      { return (2 * radius); } 



    public int getCircumference() 

      { return (int)(2 * Math.PI * radius); } 



    public int getArea() 

      { return (int)(radius * radius * Math.PI); } 



    public int getRadius() 
      { return radius; } 

} 

class SliderFrame extends JFrame 
{ 
     private JSlider diameterJSlider; 
     private Circle1 myPanel; 

     public SliderFrame() 
     { 

     super("HW2"); 

     myPanel = new Circle1(); 


     diameterJSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 300, 10); 
     diameterJSlider.setMajorTickSpacing(10); 
     diameterJSlider.setPaintTicks(true); 
     diameterJSlider.addChangeListener(new ChangeListener() 
     { 
     public void stateChanged(ChangeEvent e) 
     { 
      myPanel.setDiameter(diameterJSlider.getValue()); 
     } 
     } 
    ); 
     add(diameterJSlider, BorderLayout.NORTH); 
     add(myPanel, BorderLayout.CENTER); 
    } 
    } 
+0

autant que je peux dire, 'SliderFrame' est jamais utilisé dans votre code – MadProgrammer

+1

Vous devez également appellerez' super.paintComponent' avant d'effectuer une peinture personnalisée , sinon cela va générer des artefacts de peinture méchant et aléatoire – MadProgrammer

+0

J'utilise le 'diameterJSlider' qui a bien fonctionné quand je l'ai utilisé sur une interface graphique séparée et il a affiché le curseur. – SkyWard

Répondre

2

Circle1 est une fenêtre, il ne peut pas être ajouté à une autre fenêtre, de sorte que votre SliderFrame est déjà en train de faire quelque chose de mal, c'est pourquoi il est généralement déconseillé d'étendre directement à partir d'un conteneur de niveau supérieur comme JFrame et au lieu, vous devriez commencer par quelque chose comme JPanel

Ainsi, vous pourriez commencer par quelque chose comme ...

public class Circle1 extends JPanel { 

    private final CircleCanvas theCanvas; 

    private final JTextArea display; 

    public Circle1() { 

     setLayout(new BorderLayout()); 

     theCanvas = new CircleCanvas(); 

     display = new JTextArea(4, 30); 

     display.setText("The Radius: " + theCanvas.getRadius() + "\nThe Diameter: " + theCanvas.getDiameter() + "\nThe Area: " + theCanvas.getArea() 
         + "\nThe Circumference: " + theCanvas.getCircumference()); 

     add(theCanvas, BorderLayout.CENTER); 
     add(display, BorderLayout.SOUTH); 

    } 

    void setDiameter(int value) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    class CircleCanvas extends JPanel { 

     private final int radius; 

     public CircleCanvas() { 

      radius = (int) (1 + Math.random() * 100); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(100, 100); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawOval(0, 0, radius, radius); 
     } 

     public int getDiameter() { 
      return (2 * radius); 
     } 

     public int getCircumference() { 
      return (int) (2 * Math.PI * radius); 
     } 

     public int getArea() { 
      return (int) (radius * radius * Math.PI); 
     } 

     public int getRadius() { 
      return radius; 
     } 

    } 
} 

que vous pourriez alors utiliser quelque chose comme ...

EventQueue.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
      ex.printStackTrace(); 
     } 

     JFrame frame = new JFrame("Testing"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new Circle1()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
}); 

à afficher.

Ensuite, vous pouvez changer votre SliderFrame à quelque chose comme ...

public class SliderPane extends JPanel { 

    private JSlider diameterJSlider; 
    private Circle1 myPanel; 

    public SliderPane() { 

     setLayout(new BorderLayout()); 

     myPanel = new Circle1(); 

     diameterJSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 300, 10); 
     diameterJSlider.setMajorTickSpacing(10); 
     diameterJSlider.setPaintTicks(true); 
     diameterJSlider.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       myPanel.setDiameter(diameterJSlider.getValue()); 
      } 
     } 
     ); 
     add(diameterJSlider, BorderLayout.NORTH); 
     add(myPanel, BorderLayout.CENTER); 
    } 
} 

Et utiliser quelque chose comme ...

EventQueue.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
      ex.printStackTrace(); 
     } 

     JFrame frame = new JFrame("Testing"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SliderPane()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
}); 

de le montrer.

Slider

exemple Runnable

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.JTextArea; 
import javax.swing.SwingConstants; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       // Change these two lines to switch between the panels 
       //frame.add(new Circle1()); 
       frame.add(new SliderPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class Circle1 extends JPanel { 

     private final CircleCanvas theCanvas; 

     private final JTextArea display; 

     public Circle1() { 

      setLayout(new BorderLayout()); 

      theCanvas = new CircleCanvas(); 

      display = new JTextArea(4, 30); 

      display.setText("The Radius: " + theCanvas.getRadius() + "\nThe Diameter: " + theCanvas.getDiameter() + "\nThe Area: " + theCanvas.getArea() 
          + "\nThe Circumference: " + theCanvas.getCircumference()); 

      add(theCanvas, BorderLayout.CENTER); 
      add(display, BorderLayout.SOUTH); 

     } 

     void setDiameter(int value) { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

     class CircleCanvas extends JPanel { 

      private final int radius; 

      public CircleCanvas() { 

       radius = (int) (1 + Math.random() * 100); 

      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(100, 100); 
      } 

      @Override 
      public void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.drawOval(0, 0, radius, radius); 
      } 

      public int getDiameter() { 
       return (2 * radius); 
      } 

      public int getCircumference() { 
       return (int) (2 * Math.PI * radius); 
      } 

      public int getArea() { 
       return (int) (radius * radius * Math.PI); 
      } 

      public int getRadius() { 
       return radius; 
      } 

     } 
    } 

    public class SliderPane extends JPanel { 

     private JSlider diameterJSlider; 
     private Circle1 myPanel; 

     public SliderPane() { 

      setLayout(new BorderLayout()); 

      myPanel = new Circle1(); 

      diameterJSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 300, 10); 
      diameterJSlider.setMajorTickSpacing(10); 
      diameterJSlider.setPaintTicks(true); 
      diameterJSlider.addChangeListener(new ChangeListener() { 
       public void stateChanged(ChangeEvent e) { 
        myPanel.setDiameter(diameterJSlider.getValue()); 
       } 
      } 
      ); 
      add(diameterJSlider, BorderLayout.NORTH); 
      add(myPanel, BorderLayout.CENTER); 
     } 
    } 

} 
+0

Serais-je juste ajouter la classe principale en bas? VOUS ETES UNE VIE SAVEZ MON HOMME! va certainement accepter votre excellente réponse! – SkyWard

+0

Vous ajouteriez le 'main' où cela avait du sens, je supposais que chaque classe était dans son propre fichier de classe – MadProgrammer

+0

Je les ai juste tous dans une classe et nommé un public de classe et avait le principal à la fin. – SkyWard