2013-05-15 3 views
0

У меня проблема с моим компонентом на Java. Проблема в том, что в моем графическом интерфейсе я не вижу никаких изменений в цветах овалов. Если для флага OVF установлено значение false, они должны быть белыми, а когда флаг OVF установлен в true, они должны быть красными. Но когда я запускаю свою программу, флаг OVF установлен в fasle, и все овалы белые - это хорошо. Когда флаг меняется на true, овалы все еще белые. Я пытаюсь добавить функцию repaint(), но белые овалы все еще мигают, без изменения цвета. Вот мой код класса КОМПОНЕНТ:Frozen Java Jcomponent

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

public class Komponent extends JComponent { 

    Counter counter3; 

    public Komponent() { 
     counter3 = new Counter(); 
    } 

    @Override 
    public void paint(Graphics g) { 
     Graphics2D dioda = (Graphics2D) g; 
     int x1 = 85; 
     int x2 = 135; 
     int x3 = 35; 
     int x4 = 185; 
     int x5 = 235; 
     int x6 = 88; 
     int x7 = 138; 
     int x8 = 38; 
     int x9 = 188; 
     int x10 = 238; 
     int y_ob = 0; 
     int y = 3; 
     int width_ob = getSize().width/9; 
     int height_ob = getSize().height - 1; 
     int width = (getSize().width/9) - 6; 
     int height = (getSize().height - 1) - 6; 
     if (counter3.OVF == true) { 
      dioda.setColor(Color.BLACK); 
      dioda.fillOval(x1, y_ob, width_ob, height_ob); 
      dioda.fillOval(x2, y_ob, width_ob, height_ob); 
      dioda.fillOval(x3, y_ob, width_ob, height_ob); 
      dioda.fillOval(x4, y_ob, width_ob, height_ob); 
      dioda.fillOval(x5, y_ob, width_ob, height_ob); 
      dioda.setColor(Color.RED); 
      dioda.fillOval(x6, y, width, height); 
      dioda.fillOval(x7, y, width, height); 
      dioda.fillOval(x8, y, width, height); 
      dioda.fillOval(x9, y, width, height); 
      dioda.fillOval(x10, y, width, height); 
      repaint(); 
     } 
     if (counter3.OVF == false) { 
      dioda.setColor(Color.BLACK); 
      dioda.fillOval(x1, y_ob, width_ob, height_ob); 
      dioda.fillOval(x2, y_ob, width_ob, height_ob); 
      dioda.fillOval(x3, y_ob, width_ob, height_ob); 
      dioda.fillOval(x4, y_ob, width_ob, height_ob); 
      dioda.fillOval(x5, y_ob, width_ob, height_ob); 
      dioda.setColor(Color.WHITE); 
      dioda.fillOval(x6, y, width, height); 
      dioda.fillOval(x7, y, width, height); 
      dioda.fillOval(x8, y, width, height); 
      dioda.fillOval(x9, y, width, height); 
      dioda.fillOval(x10, y, width, height); 
      repaint(); 
     } 
    } 

    public static void main(String[] arg) { 
     new Komponent(); 
    } 
} 

Пожалуйста, помогите (извините за мой английский);)

+0

Дайте нам код, в котором вы меняете флаг OVF на true. –

+0

почему новый поток, что не так с последним, кстати, есть запрос на SSCCE, ....... your effort.equalsIgnoreCase (потенциально хорошие ответы) – mKorbel

+0

Это не проблема, ведьма изменила OVF на true, потому что когда OVF флаг в моем графическом интерфейсе. У меня есть ярлык, и когда OVF истинна, видимый ярлык установлен в true - и он работает. – Martyn

ответ

2

Вы называете перекрасить() внутри краски() - метод? который снова вызывает метод paint(), который может снова вызвать repaint() и т. д.

Не уверен, если это ваша проблема, но я думаю, что вы вызываете перерисовку в неправильном месте.

+0

Я попытался добавить в свой класс графический интерфейс: komponent2.repaint(); , когда я нажимаю кнопку COUNT UP (и если она подсчитывается до 10, тогда OVF = true), но она не работает – Martyn

+0

Жаль, я понятия не имею, что еще может сделать трюк ... Может быть, что предложил mKorbel? звучит неплохо. жаль, что тратил ваше время на попытку моего решения – desperateCoder

+0

Спасибо, что постарались мне помочь! – Martyn

3
  1. переопределение getPreferredSize, то координаты будут getHeight/Weight

  2. Пользовательские картины в Swing, это делается с помощью public void paintComponent(Graphics g) { вместо общественного void paint(Graphics g) {

  3. первой строке кода внутри paintComponent должен быть super.paintComponent(g);

  4. начало Swing Timer для журнала repaint() в случае необходимости

  5. нет оснований для создания всех элементов на время выполнения, поместить все элементы в array (два массива в вашем случае), внутри paintComponent только петель внутри массива

EDIT (отдых зависит от вас, пункт 1-й и 5-й)

enter image description here. , enter image description here

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

public class Komponent { 

    private boolean counter3 = false; 
    private JFrame frame = new JFrame(); 
    private Timer timer; 
    private CustomComponents cc1 = new CustomComponents(); 

    public Komponent() { 
     counter3 = false; 
     frame = new JFrame(); 
     frame.setLayout(new GridLayout(1, 1, 10, 10)); 
     frame.add(cc1); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(100, 100); 
     frame.pack(); 
     frame.setVisible(true); 
     timer = new javax.swing.Timer(1500, updateCol()); 
     timer.setRepeats(true); 
     timer.start(); 
    } 

    private Action updateCol() { 
     return new AbstractAction("Hello World") { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       boolean bol = counter3; 
       if (bol) { 
        counter3 = false; 
        cc1.repaint(); 
       } else { 
        counter3 = true; 
        cc1.repaint(); 
       } 
      } 
     }; 
    } 

    class CustomComponents extends JComponent { 

     private static final long serialVersionUID = 1L; 

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

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

     @Override 
     public Dimension getMaximumSize() { 
      return new Dimension(300, 300); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D dioda = (Graphics2D) g; 
      int x1 = 85; 
      int x2 = 135; 
      int x3 = 35; 
      int x4 = 185; 
      int x5 = 235; 
      int x6 = 88; 
      int x7 = 138; 
      int x8 = 38; 
      int x9 = 188; 
      int x10 = 238; 
      int y_ob = 0; 
      int y = 3; 
      int width_ob = getSize().width/9; 
      int height_ob = getSize().height - 1; 
      int width = (getSize().width/9) - 6; 
      int height = (getSize().height - 1) - 6; 
      if (counter3) { 
       dioda.setColor(Color.BLACK); 
       dioda.fillOval(x1, y_ob, width_ob, height_ob); 
       dioda.fillOval(x2, y_ob, width_ob, height_ob); 
       dioda.fillOval(x3, y_ob, width_ob, height_ob); 
       dioda.fillOval(x4, y_ob, width_ob, height_ob); 
       dioda.fillOval(x5, y_ob, width_ob, height_ob); 
       dioda.setColor(Color.RED); 
       dioda.fillOval(x6, y, width, height); 
       dioda.fillOval(x7, y, width, height); 
       dioda.fillOval(x8, y, width, height); 
       dioda.fillOval(x9, y, width, height); 
       dioda.fillOval(x10, y, width, height); 
      } else { 
       dioda.setColor(Color.BLACK); 
       dioda.fillOval(x1, y_ob, width_ob, height_ob); 
       dioda.fillOval(x2, y_ob, width_ob, height_ob); 
       dioda.fillOval(x3, y_ob, width_ob, height_ob); 
       dioda.fillOval(x4, y_ob, width_ob, height_ob); 
       dioda.fillOval(x5, y_ob, width_ob, height_ob); 
       dioda.setColor(Color.WHITE); 
       dioda.fillOval(x6, y, width, height); 
       dioda.fillOval(x7, y, width, height); 
       dioda.fillOval(x8, y, width, height); 
       dioda.fillOval(x9, y, width, height); 
       dioda.fillOval(x10, y, width, height); 
      } 
      dioda.dispose(); 
     } 
    } 

    public static void main(String[] arg) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Komponent komponent = new Komponent(); 
      } 
     }); 
    } 
} 
+0

Я пытаюсь сделать это прямо сейчас, а после этого я расскажу вам свои результаты. Спасибо – Martyn

+0

Я сделал 2-й и 3-й пункты (1-й и 4-й я сделаю это позже - это не связано с моей проблемой), но он все еще не работает. Я не понимаю пятого пункта - это самое важное для решения моей проблемы? – Martyn

+0

, но он все еще не работает. == SSCCE, 5-й пункт не важен, речь идет о концепции кодирования – mKorbel