2014-12-30 4 views
1

Более низкий исходный код, с изображенным примером, с поста Circular Progress Bar for Java Swing not working, является отличной функцией Swing.Как настроить графику на индикаторе прогресса Swing?

Я хотел бы иметь возможность использовать его с «прозрачным» JFrame или оконным стеклом , но графика «лепестки», в краске(), хочет взаимодействовать с фоном, так что если Непрозрачность фон очень низкий, вы можете едва увидеть «лепестки». Не будучи знакомым с функциями Graphics2D, я сделал много ударов в темноте, чтобы попытаться настроить код, но не повезло, так может кто-то, кто знает, как работают эти функции, предлагает изменения, чтобы «лепестки» не наносили никаких ошибок, t взаимодействуют с фоном, и начинают сплошной белый, и постепенно исчезают, как это делает код?

Я также не нужны никакие введения или исчезать из задержек, и я также возникают сложности с этим, но если кто-то может просто предложить модификации для «лепестков», это было бы здорово!

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import javax.swing.*; 
import javax.swing.plaf.LayerUI; 

public class Loading_Test { 

static final WaitLayerUI layerUI = new WaitLayerUI(); 
JFrame frame = new JFrame("JLayer With Animated Gif"); 

public Loading_Test() { 
    JPanel panel = new JPanel() { 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(400, 300); 
     } 
    }; 
    JLayer<JPanel> jlayer = new JLayer<>(panel, layerUI); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(jlayer); 
    frame.pack(); 
    frame.setVisible(true); 
    layerUI.start(); 
} 

public static void main(String args[]) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      Loading_Test loading_Test = new Loading_Test(); 

     } 
    }); 
} 
} 

class WaitLayerUI extends LayerUI<JPanel> implements ActionListener { 

private boolean mIsRunning; 
private boolean mIsFadingOut; 
private Timer mTimer; 
private int mAngle; 
private int mFadeCount; 
private int mFadeLimit = 15; 

@Override 
public void paint(Graphics g, JComponent c) { 
    int w = c.getWidth(); 
    int h = c.getHeight(); 
    super.paint(g, c); // Paint the view. 
    if (!mIsRunning) { 
     return; 
    } 
    Graphics2D g2 = (Graphics2D) g.create(); 
    float fade = (float) mFadeCount/(float) mFadeLimit; 
    Composite urComposite = g2.getComposite(); // Gray it out. 
    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f * fade)); 
    g2.fillRect(0, 0, w, h); 
    g2.setComposite(urComposite); 
    int s = Math.min(w, h)/5;// Paint the wait indicator. 
    int cx = w/2; 
    int cy = h/2; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2.setStroke(new BasicStroke(s/4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
    g2.setPaint(Color.white); 
    g2.rotate(Math.PI * mAngle/180, cx, cy); 
    for (int i = 0; i < 12; i++) { 
     float scale = (11.0f - (float) i)/11.0f; 
     g2.drawLine(cx + s, cy, cx + s * 2, cy); 
     g2.rotate(-Math.PI/6, cx, cy); 
     g2.setComposite(AlphaComposite.getInstance(
       AlphaComposite.SRC_OVER, scale * fade)); 
    } 
    g2.dispose(); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    if (mIsRunning) { 
     firePropertyChange("tick", 0, 1); 
     mAngle += 3; 
     if (mAngle >= 360) { 
      mAngle = 0; 
     } 
     if (mIsFadingOut) { 
      if (--mFadeCount == 0) { 
       mIsRunning = false; 
       mTimer.stop(); 
      } 
     } else if (mFadeCount < mFadeLimit) { 
      mFadeCount++; 
     } 
    } 
} 

public void start() { 
    if (mIsRunning) { 
     return; 
    } 
    mIsRunning = true;// Run a thread for animation. 
    mIsFadingOut = false; 
    mFadeCount = 0; 
    int fps = 24; 
    int tick = 1000/fps; 
    mTimer = new Timer(tick, this); 
    mTimer.start(); 
} 

public void stop() { 
    mIsFadingOut = true; 
} 

@Override 
public void applyPropertyChange(PropertyChangeEvent pce, JLayer l) { 
    if ("tick".equals(pce.getPropertyName())) { 
     l.repaint(); 
    } 
} 
} 
+0

вы спрашиваете, как сделать этот код работать на компоненте, который является полупрозрачным (то есть краски оно содержимое с альфа между 0 и 1)? – VGR

+0

В значительной степени. Я могу сказать, что связанные с Composite инструкции, в paint(), взаимодействуют с местом назначения, фоном, и я хочу, чтобы индикатор Progress отображался хорошо. Кроме того, я видел JXBusyLabel, но я предпочел бы использовать этот гораздо более короткий код. – user1572522

ответ

1

Одна из проблем, которые я вижу, заключается в том, что код устанавливает композит в неправильном месте в цикле. Он работает, но, как вы обнаружили, его трудно поддерживать или изменять.

g2.setComposite вызывается на конце петли. Это устанавливает альфу для следующего лепестка. Это означает, что вы не можете легко изменить альфа самого первого лепестка.

Во-первых, я хотел бы сделать код более в соответствии с тем, как люди думают (по крайней мере, как я думаю): Установите альфу линии, которую Вы собираетесь рисовать, прямо перед тем, как сделать это:

for (int i = 0; i < 12; i++) { 
    float scale = (12 - i)/12f; 
    g2.setComposite(AlphaComposite.getInstance(
      AlphaComposite.SRC_OVER, scale * fade)); 
    g2.drawLine(cx + s, cy, cx + s * 2, cy); 
    g2.rotate(-Math.PI/6, cx, cy); 
} 

Теперь, делая его работу с любым произвольным фоном, это просто. Мы просто отрегулировать значение scale:

float componentAlpha = 0.5f; 

for (int i = 0; i < 12; i++) { 
    float scale = (12 - i)/12f; 

    // Give petals the same relative alpha as the component 
    // they're overlaying. 
    scale *= componentAlpha; 

    g2.setComposite(AlphaComposite.getInstance(
      AlphaComposite.SRC_OVER, scale * fade)); 
    g2.drawLine(cx + s, cy, cx + s * 2, cy); 
    g2.rotate(-Math.PI/6, cx, cy); 
} 
+0

Большое вам спасибо! Если кому-то интересно, исходный код Taptaptap.java находится здесь: http://www.liafa.jussieu.fr/~yunes/cours/annexes/java/docs/tutorial/uiswing/misc/jlayer.html – user1572522

+0

Плюс один, но я уверен, что несколько примеров превосходного кода от @aterai здесь – mKorbel

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