2013-06-15 4 views
1

Я пытаюсь создать программу для java, и у меня есть общая проблема с мерцанием. Я пытался многое устранить, но все равно. в то время как овал, который я рисую, перемещает japplet, мерцает. Мне нужна ваша помощь для решения этой проблемы. вот мой код:Как остановить repaint() мерцание

import java.awt.Color; 

public class all extends JApplet implements Runnable { 

    double x=0; 
    double y=0; 
    int m=0; 
    int n=0; 
    int f=30; 
    int μ=0; 
    Thread kinisi; 
    JPanel panel; 
    JFrame frame; 
    private boolean running = false; 
    private JTextField textField1; 
    private JTextField textField2; 
    Image backGround; 
    JPanel panel_3; 
    Image bf = createImage(m, n); 
    private Graphics doubleg; 
    private Image i; 

    public void init() { 
     this.setSize(800, 700); 
    } 

    public all() { 
     getContentPane().setLayout(null); 

     JButton btnNewButton = new JButton("Start"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       String b=textField2.getText(); 
       String z =textField1.getText(); 
       if (textField1.getText().equals("") || 
        textField2.getText().equals("")){ 
        JOptionPane.showMessageDialog(
         new JFrame(), 
         "Δωστε τιμή για το φ και το μ!", 
         "ERROR",JOptionPane.ERROR_MESSAGE); 
     } else{ 
       f = Integer.parseInt(b); 
       μ = Integer.parseInt(z); 
       Start(); } 
      } 
     }); 
     btnNewButton.setBounds(469, 168, 89, 23); 
     getContentPane().add(btnNewButton); 

     JButton btnStop = new JButton("Pause"); 
     btnStop.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       pause(); 
      } 
     }); 
     btnStop.setBounds(588, 168, 89, 23); 
     getContentPane().add(btnStop); 

     JButton btnReset = new JButton("Reset"); 
     btnReset.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       Reset(); 
      } 
     }); 
     btnReset.setBounds(701, 168, 89, 23); 
     getContentPane().add(btnReset); 

     JLabel label = new JLabel("\u03BC"); 
     label.setHorizontalAlignment(SwingConstants.CENTER); 
     label.setBounds(549, 63, 46, 14); 
     getContentPane().add(label); 

     textField1 = new JTextField(); 
     textField1.setBounds(529, 101, 86, 20); 
     getContentPane().add(textField1); 
     textField1.setColumns(10); 

     JLabel label_1 = new JLabel("\u03C6"); 
     label_1.setHorizontalAlignment(SwingConstants.CENTER); 
     label_1.setBounds(681, 63, 46, 14); 
     getContentPane().add(label_1); 

     textField2 = new JTextField(); 
     textField2.setBounds(667, 101, 86, 20); 
     getContentPane().add(textField2); 
     textField2.setColumns(10); 

     JButton btnNewButton_1 = new JButton(""); 
     btnNewButton_1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       JOptionPane.showMessageDialog(
        new JFrame(), 
        "Οδηγίες προγράμματος","Οδηγίες", 
        JOptionPane.INFORMATION_MESSAGE); 
       } 
     }); 
     btnNewButton_1.setIcon(
      new ImageIcon(all.class.getResource("/Images/info.png"))); 
     btnNewButton_1.setBounds(732, 5, 39, 35); 
     getContentPane().add(btnNewButton_1); 

     JLabel label_2 = new JLabel(""); 
     label_2.setIcon(
      new ImageIcon(all.class.getResource("/Images/earth.jpg"))); 
     label_2.setBounds(-20, 0, 820, 361); 
     getContentPane().add(label_2); 

     JPanel panel_1 = new JPanel(); 
     panel_1.setBorder(
      new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); 
     panel_1.setBounds(10, 372, 369, 290); 
     getContentPane().add(panel_1); 

     JPanel panel_2 = new JPanel(); 
     panel_2.setBorder(
      new BevelBorder(BevelBorder.LOWERED, null, null, null, null)); 
     panel_2.setBounds(408, 372, 369, 290); 
     getContentPane().add(panel_2); 
    } 

    public void paint(Graphics g){ 
     super.paint(g); 
     g.drawLine(0,f,350,200); 
     g.drawLine(0,200,350,200); 
     g.drawOval(m,n,40,40); 
     Color brown=new Color(137,66,0); 
     g.setColor(brown); 
     g.fillOval(m, n, 40, 40); 
     //Graphics2D g2d = (Graphics2D) g; 
     g.drawLine(460,400,460,650); 
     g.drawLine(20, 620, 350, 620); 
     g.drawLine(50,400,50,650); 
     g.drawLine(430, 620, 760, 620); 
    } 

    public void Start() { 
     kinisi = new Thread(this); 
     kinisi.start(); 
     running = true; 
    } 

    public void run() { 
     while (running) { 
      if (x < 340){ 
       double l = 200-f; 
       double k = l/350; 
       double y=k*x+f-30; 
       x= x+1; 
       m = (int) x; 
       n = (int) y; 
       repaint(); 
       try { 
        Thread.sleep(μ); 
       } catch (InterruptedException ie) {} 
      } 
     } 
    } 

    public void update(Graphics g) { 
     if(i==null){ 
      i=createImage(800,700); 
      doubleg = i.getGraphics(); 
     } 
     doubleg.setColor(getBackground()); 
     doubleg.fillRect(0,0,800,700); 
     doubleg.setColor(getForeground()); 
     paint(doubleg); 
     g.drawImage(i,0,0,this); 
    } 

    public void paint1(Graphics g){ 
     g.drawLine(0, f ,350, 200); 
     g.drawOval(m, n, 40, 40); 
     Color brown=new Color(137,66,0); 
     g.setColor(brown); 
     g.fillOval(m, n, 40, 40); 
    } 

    public void pause() { 
     if (kinisi != null) { 
      running = false; 
     } 
    } 

    public boolean Reset() { 
     if (kinisi != null) { 
      running = false; 
      kinisi.interrupt(); 
      kinisi = null; 
      x=0; 
      y=0; 
      f=30; 
      m=0; 
      n=0; 
      repaint(); 
      textField1.setText(""); 
      textField2.setText(""); 
     } 
     Graphics g = getGraphics(); 
     g.drawOval(m,n,40,40); 
     Color brown=new Color(137,66,0); 
     g.setColor(brown); 
     g.fillOval(m, n, 40, 40); 
     return false; 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("FISIKI"); 
     frame.getContentPane().add(new all()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(800, 700); 
     frame.setVisible(true); 
     frame.setResizable(false); 
    } 
} 

Спасибо вам большое и жаль, что мой английский не очень хорош!

+0

Вам необходимо удвоить буфер. –

+0

@Legend Технически, они (см. Метод 'update'). Реальный вопрос: зачем беспокоиться, Swing - это двойной буфер, а не контейнеры верхнего уровня ... Я бы также спросил, почему использование 'JApplet', когда оно просто добавляется в' JFrame': P – MadProgrammer

+0

Не переопределяйте обновление(). Это делается при использовании AWT.Прочтите учебник Swing в [Custom Painting] (http://docs.oracle.com/javase/tutorial/uiswing/painting/index.html). – camickr

ответ

11

Есть несколько вещей, которые выпрыгивают на меня.

  • Вы простирающиеся от JApplet, но при добавлении его к JFrame
  • Вы смешивание компонентов с вами пользовательскими картинами
  • Не используя менеджер компоновки.
  • Использование getGraphics.

Во-первых ...

Вы никогда не должны отменять paint из верхнего уровня контейнера (например, JApplet). Есть много причин, и вы их нашли. Контейнеры верхнего уровня не имеют двойной буферизации. Вместо этого вы должны создать пользовательский компонент (расширяя что-то вроде JPanel) и переопределение это paintComponent метод ...

Во-вторых

Решил, как ваше приложение будет. Это апплет или приложение? Если вы следуете первой точке, то это действительно не имеет значения, так как вам просто нужно добавить панель в контейнер верхнего уровня.

В-третьих

Я хотел бы создать группу, которая сделала пользовательскую картину. Затем я создам отдельные контейнеры для всех полей и других частей приложения. Это позволит вам отделить области ответственности. Это также позволит использовать менеджеры компоновки;)

В-четвертых

менеджеров Использование макета. API-интерфейс менеджера компоновки разработан для решения одного из самых неприятных аспектов дизайна графического интерфейса, вы просите о многих проблемах и работе, которые вы решили отбросить - IMHO.

Пятое

getGraphics никогда не должны использоваться. Помимо того, что он может вернуться null, это всего лишь мгновенный снимок того, что в настоящее время находится на экране. Как только RepaintManager решает выполнить перерисовку, все, что ему оказано, будет потеряно. Вы должны использовать paintComponent для обновления состояния вашей пользовательской панели.

+0

Всегда там для отличного объяснения :) – Maroun

+0

большое спасибо за ваши советы! Я новичок в java swings, и я запутался! я постараюсь исправить все это, и я надеюсь, что мерцание исчезнет! – user2487943

+0

К сожалению, также следует добавить, что компоненты Swing по умолчанию буферизованы по умолчанию, думаю, что я сделал комментарий об этом где-то, но на всякий случай. – MadProgrammer