2013-09-20 5 views
1

У меня есть следующий код (попытка узнать качели и java). Я создал лестницу, используя прямоугольные компоненты, используя класс и помещенный в основной кадр. Все работает нормально, но если я немного изменю его размер, объект ShapeManager (т. Е. Лестница) исчезнет. Я не знаю, что происходит. Любая помощь пожалуйста.прямоугольный компонент исчезает при изменении размера рамки

GUIMain Класс:

package mainProg; 
import javax.swing.*; 
import java.awt.BorderLayout; 
import java.awt.event.*; 
import java.awt.*; 


public class GUIMain { 

    static JPanel mainPanel; 
    static JButton[] newButtons; 
    static ShapeManager newShape; 

    private static class BtnEvtHandler implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
      //System.exit(0); 
      JOptionPane.showMessageDialog(null, "WELCOME"); 
     } 

    } 

    private static JButton[] createButtons() { 
     JButton[] buttonArray= new JButton[2]; 
     buttonArray[0]=new JButton("OK"); 
     buttonArray[1]=new JButton("MOVE"); 
     BtnEvtHandler okButtonHandler= new BtnEvtHandler(); 
     (buttonArray[0]).addActionListener(okButtonHandler); 

     return buttonArray; 

    } 


    private static ShapeManager createShape(int x) { 
     ShapeManager newContent=new ShapeManager(x); 
     return newContent;  
    } 

    private static JPanel mainContainer() { 
     JPanel mainPanel= new JPanel(); 
     mainPanel.setSize(400, 400); 
     return mainPanel; 

    } 


    private static void createAndShowGUI() { 

     JFrame.setDefaultLookAndFeelDecorated(false); 
     JFrame frame = new JFrame(" DB "); 

     mainPanel= mainContainer(); 
     mainPanel.setLayout(new BorderLayout(10, 10)); 
     newButtons= createButtons(); 
     newShape= createShape(20); 

     newButtons[0].setHorizontalAlignment(0); 
     mainPanel.add(newButtons[0],BorderLayout.PAGE_START); 
     newButtons[1].setHorizontalAlignment(0); 
     mainPanel.add(newButtons[1],BorderLayout.PAGE_END); 
     newShape.setPreferredSize(new Dimension(400, 400)); 
     mainPanel.add(newShape, BorderLayout.LINE_END); 




     frame.setContentPane(mainPanel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600, 600); 
     frame.setLocation(500,200); 
     frame.setVisible(true); 
    } 


    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

ShapeManager Класс:

package mainProg; 

import javax.swing.JPanel; 

import java.awt.*; 


@SuppressWarnings("serial") 
class ShapeManager extends JPanel { 

    int rectPos; 

    ShapeManager(int rectPos) { 

     setPreferredSize(new Dimension(400,400)); 
     this.rectPos=rectPos; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     while (rectPos<150) { 
      g.setColor(Color.BLUE); 
      g.drawRect(rectPos+10, rectPos+10, 100, 10); 
      g.fillRect(rectPos+10, rectPos+10, 100, 10); 
      rectPos=rectPos+10; 

     } 
    } 
} 
+1

Вы не должны использовать статические переменные и статические методы. Это плохой дизайн и приведет к неприятностям в будущем. Я указал вам на учебник Swing в последнем вопросе. Ни один из примеров не делает этого. – camickr

+0

@camickr: Я читаю и делаю в то же время, но да, вы правы, а не полностью, я думаю, что учусь на ошибках. Я еще раз прочитаю учебники по размаху. Спасибо за напоминание. –

+0

@camickr: Не могли бы вы дать мне ссылку на учебник, в которой показаны альтернативные способы предотвращения использования статической переменной и методов. Это было бы здорово для меня. Я был знаком с python, и Java по-прежнему нова для меня. Любые советы по хорошей практике программирования с Java были бы замечательными. –

ответ

3

Вы никогда не сбросить позицию прямоугольника, поэтому после первой краски она остается выше 150. Вы должны сбросить его после того, как вы выходите из цикла while.

Попробуйте это:

g.setColor(Color.BLUE); 
int position = rectPos; 
while (position<150) { 
    position += 10; 
    g.drawRect(position, position, 100, 10); 
    g.fillRect(position, position, 100, 10); 
} 
Смежные вопросы