Я пытаюсь создать пользовательский экран загрузки для приложения Java WAVPlayer.Исходный JFrame содержит пользовательский JPanel, который отображает круглую полосу загрузки.Прогресс бара контролируется и обновляется в его собственном потоке LoadThread
.В конце этой цепочки я хочу закрыть текущий JFrame.
Я знаю, что я не могу просто использовать this.dispose()
внутри LoadThread
.Я попытался использовать экземпляр булевой переменной, которая будет контролировать, когда JFrame должен быть расположен - это был очевидный сбой.Я пытался использовать несколько потоков для управления различными процессами, но это быстро стало слишком запутанным (и не дало желаемых результатов).Я прочитал о классе Java SplashScreen, и это может быть самый простой путь.Я работаю над этим уже несколько дней, и я действительно хочу выяснить, возможно ли / необходимо то, что я пытаюсь сделать.
Ниже : Пользовательская панелькласс LoadPanel
, форма JFrame LoadingFrame
, основной класс WAVPlayer
public class LoadPanel extends JPanel{
int progress=0;
public void UpdateProgress(int progressVal){
this.progress=progressVal;
}
@Override
public void paint(Graphics g){
super.paint(g);
Graphics2D g2=(Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON); // cleans gfx lines
g2.translate(this.getWidth()/2,this.getHeight()/2);
g2.rotate(Math.toRadians(270));
Arc2D.Float arc=new Arc2D.Float(Arc2D.PIE);
Ellipse2D circle=new Ellipse2D.Float(0,0,110,110);
arc.setFrameFromCenter(new Point(0,0),new Point(120,120));
circle.setFrameFromCenter(new Point(0,0),new Point(110,110));
arc.setAngleStart(1);
arc.setAngleExtent(-progress*3.6); // 360/100=3.6
g2.setColor(Color.BLUE); // creating progress circles
g2.draw(arc);
g2.fill(arc);
g2.setColor(Color.BLACK);
g2.draw(circle);
g2.fill(circle);
}
}
public class LoadingFrame extends javax.swing.JFrame {
private Thread LoadThread;
public LoadingFrame() {
setUndecorated(true);
setBackground(new Color(0,0,0,0));
initComponents();
Application.getApplication().setDockIconImage(new ImageIcon(getClass()
.getResource("/waveicons/WAVE_ICON32.png")).getImage());
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
testButton = new javax.swing.JButton();
jp_progress = new wavplayer.LoadPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
testButton.setText("testButton");
testButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
testButtonActionPerformed(evt);
}
});
jp_progress.setBackground(new Color(0,0,0,0));
javax.swing.GroupLayout jp_progressLayout = new javax.swing.GroupLayout(jp_progress);
jp_progress.setLayout(jp_progressLayout);
jp_progressLayout.setHorizontalGroup(
jp_progressLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
jp_progressLayout.setVerticalGroup(
jp_progressLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jp_progress, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(testButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(133, 133, 133)
.addComponent(testButton)
.addContainerGap(138, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jp_progress, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}// </editor-fold>
private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {
testButton.setEnabled(false);
LoadThread=new Thread(new Runnable(){
@Override
public void run(){
for (int num = 1; num <= 100; num++) {
jp_progress.UpdateProgress(num);
jp_progress.repaint();
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
Logger.getLogger(LoadingFrame.class.getName())
.log(Level.SEVERE, null, ex);
}
}
testButton.setEnabled(true);
}
});
LoadThread.start();
}
// Variables declaration - do not modify
private wavplayer.LoadPanel jp_progress;
private javax.swing.JButton testButton;
// End of variables declaration
}
public class WAVPlayer {
public static void main(String[] args) {
LoadingFrame frame=new LoadingFrame();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.pack();
System.out.println("Im here at the end of main");
}
}