2015-10-12 2 views
1

Я действительно разочарован, потому что графический интерфейс отображается, но нет JSlider! Хорошо, поэтому графический интерфейс должен отображать круг, JTextfield (который обновляется при перемещении ползунка). Текстовое поле должно отображать радиус, диаметр и т. Д. И автоматически обновлять его при перемещении ползунка. Круг также должен увеличиваться в размере или уменьшаться после перемещения слайдера. Вот мой код. Ошибок нет, работает нормально и компилируется. Вероятно, мои координаты отключены.Почему мой JSlider не отображается в моем графическом интерфейсе 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

Насколько я могу сказать, 'SliderFrame' никогда не используется в коде – MadProgrammer

+1

Вы также должны быть вызывающей' super.paintComponent', прежде чем выполнять какие-либо пользовательские картины , в противном случае это создаст некоторые неприятные и случайные артефакты живописи. – MadProgrammer

+0

Я использую 'diameterJSlider', который отлично работал, когда я использовал его в отдельном графическом интерфейсе, и он отображал слайдер. – SkyWard

ответ

2

Circle1 это окно, оно не может быть добавлено к другому окну, так что ваши SliderFrame уже делает что-то неправильно, поэтому он обычно не рекомендуется, чтобы продлить непосредственно из контейнера верхнего уровня, как JFrame и вместо этого, вы должны начать с чем-то вроде JPanel

Итак, вы могли бы начать с чем-то вроде ...

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

    } 
} 

Что вы могли бы использовать что-то вроде ...

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

для отображения.

Тогда вы можете изменить ваш SliderFrame нечто большее, как ...

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

И использовать что-то вроде ...

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

, чтобы показать это.

Slider

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

Может, я просто добавлю основной класс внизу? ВЫ ЖИЗНЬ СПАСИБО МОЙ ЧЕЛОВЕК! обязательно примут ваш отличный ответ! – SkyWard

+0

Вы бы добавили 'main', где это имело смысл, я предположил, что каждый класс был в его собственном файле класса – MadProgrammer

+0

Я просто их всех в одном классе и назвал одним классом публичным и имел основной в конце. – SkyWard

Смежные вопросы