forked from fanruan/design
zack
6 years ago
12 changed files with 394 additions and 27 deletions
@ -0,0 +1,39 @@
|
||||
package com.fr.design.gui.iprogressbar; |
||||
|
||||
import javax.swing.ProgressMonitor; |
||||
import java.awt.Component; |
||||
|
||||
/** |
||||
* Created by zack on 2018/6/20. |
||||
*/ |
||||
public class FRProgressMonitor extends ProgressMonitor { |
||||
/** |
||||
* Constructs a graphic object that shows progress, typically by filling |
||||
* in a rectangular bar as the process nears completion. |
||||
* |
||||
* @param parentComponent the parent component for the dialog box |
||||
* @param message a descriptive message that will be shown |
||||
* to the user to indicate what operation is being monitored. |
||||
* This does not change as the operation progresses. |
||||
* See the message parameters to methods in |
||||
* {@link JOptionPane#message} |
||||
* for the range of values. |
||||
* @param note a short note describing the state of the |
||||
* operation. As the operation progresses, you can call |
||||
* setNote to change the note displayed. This is used, |
||||
* for example, in operations that iterate through a |
||||
* list of files to show the name of the file being processes. |
||||
* If note is initially null, there will be no note line |
||||
* in the dialog box and setNote will be ineffective |
||||
* @param min the lower bound of the range |
||||
* @param max the upper bound of the range |
||||
* @see JDialog |
||||
* @see JOptionPane |
||||
*/ |
||||
public FRProgressMonitor(Component parentComponent, Object message, String note, int min, int max) { |
||||
super(parentComponent, message, note, min, max); |
||||
} |
||||
public void setUndecorated(){ |
||||
|
||||
} |
||||
} |
@ -0,0 +1,83 @@
|
||||
package com.fr.design.gui.iprogressbar; |
||||
|
||||
import com.fr.design.utils.ThemeUtils; |
||||
|
||||
import javax.swing.LookAndFeel; |
||||
import java.awt.Color; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.RenderingHints; |
||||
import java.awt.geom.RoundRectangle2D; |
||||
|
||||
/** |
||||
* 新进度条UI(暂时只处理了非模糊场景) |
||||
* Created by zack on 2018/6/21. |
||||
*/ |
||||
public class ModernUIProgressBarUI extends UIProgressBarUI { |
||||
// draw determinate
|
||||
@Override |
||||
protected void drawXpHorzProgress(Graphics g, int x, int y, |
||||
int w, int h, int amountFull) { |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
g2d.translate(x, y); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
if (!progressBar.isOpaque()) { |
||||
//绘制进度条背板
|
||||
g2d.setColor(progressBar.getBackground()); |
||||
RoundRectangle2D roundedRectangle = new RoundRectangle2D.Float(0, 0, w, h, 10, 10); |
||||
g2d.fill(roundedRectangle); |
||||
} |
||||
//
|
||||
g2d.setColor(progressBar.getForeground()); |
||||
int mx = 0; |
||||
while (mx < amountFull) { |
||||
RoundRectangle2D roundedRectangle = new RoundRectangle2D.Float(0, 0, amountFull, h, 10, 10); |
||||
g2d.fill(roundedRectangle); |
||||
mx += 8; |
||||
} |
||||
g2d.translate(-x, -y); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); |
||||
} |
||||
|
||||
|
||||
// draw determinate
|
||||
@Override |
||||
protected void drawXpVertProgress(Graphics g, int x, int y, |
||||
int w, int h, int amountFull) { |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g2d.translate(x, y); |
||||
// paint the track
|
||||
if (!progressBar.isOpaque()) { |
||||
g.setColor(progressBar.getBackground()); |
||||
RoundRectangle2D roundedRectangle = new RoundRectangle2D.Float(0, 0, w, h, 10, 10); |
||||
g2d.fill(roundedRectangle); |
||||
} |
||||
// paints bottom to top...
|
||||
int my = 0; |
||||
while (my < amountFull) { |
||||
RoundRectangle2D roundedRectangle = new RoundRectangle2D.Float(0, 0, w, amountFull, 10, 10); |
||||
g2d.fill(roundedRectangle); |
||||
my += 8; |
||||
} |
||||
g.translate(-x, -y); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); |
||||
} |
||||
|
||||
@Override |
||||
protected Color getSelectionForeground() { |
||||
return ThemeUtils.PROCESS_SELECTED_FORECOLOR; |
||||
} |
||||
|
||||
@Override |
||||
protected Color getSelectionBackground() { |
||||
return ThemeUtils.PROCESS_SELECTED_BACKCOLOR; |
||||
} |
||||
|
||||
@Override |
||||
protected void installDefaults() { |
||||
LookAndFeel.installBorder(progressBar, "ProgressBar.border"); |
||||
LookAndFeel.installColorsAndFont(progressBar, |
||||
"ProgressBar.modern.background", "ProgressBar.modern.foreground", "ProgressBar.font"); |
||||
} |
||||
} |
@ -0,0 +1,80 @@
|
||||
package com.fr.design.gui.iprogressbar; |
||||
|
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.JDialog; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JProgressBar; |
||||
import javax.swing.plaf.ColorUIResource; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.Frame; |
||||
|
||||
/** |
||||
* 加载进度弹窗 |
||||
*/ |
||||
public class ProgressDialog extends UIDialog { |
||||
private JProgressBar progressBar; |
||||
private JDialog centerDialog; |
||||
private JLabel text; |
||||
|
||||
public ProgressDialog(Frame parent) { |
||||
super(parent); |
||||
setUndecorated(true); |
||||
setSize(parent.getSize()); |
||||
setLocationRelativeTo(null); |
||||
setOpacity(0.5f); |
||||
initComponent(); |
||||
} |
||||
|
||||
private void initComponent() { |
||||
|
||||
centerDialog = new JDialog(this); |
||||
centerDialog.setSize(new Dimension(482, 124)); |
||||
centerDialog.setUndecorated(true); |
||||
GUICoreUtils.centerWindow(centerDialog); |
||||
JPanel panel = new JPanel(); |
||||
panel.setBorder(new UIProgressBorder(3, UIConstants.DEFAULT_BG_RULER, 14, 46, 47, 37, 47)); |
||||
panel.setLayout(new BorderLayout(4, 15)); |
||||
progressBar = new JProgressBar(); |
||||
progressBar.setUI(new ModernUIProgressBarUI()); |
||||
progressBar.setBorderPainted(false); |
||||
progressBar.setOpaque(false); |
||||
progressBar.setBorder(null); |
||||
panel.add(progressBar, BorderLayout.CENTER); |
||||
text = new UILabel(Inter.getLocText("FR-Designer_Loading_Project"), JLabel.CENTER); |
||||
FRFont font = FRFont.getInstance().applySize(14).applyForeground(new ColorUIResource(333334)); |
||||
text.setFont(font); |
||||
panel.add(text, BorderLayout.SOUTH); |
||||
centerDialog.getContentPane().add(panel); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void checkValid() throws Exception { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setVisible(boolean b) { |
||||
super.setVisible(b); |
||||
centerDialog.setVisible(b); |
||||
centerDialog.setResizable(false); |
||||
} |
||||
|
||||
public void setProgressValue(int value) { |
||||
progressBar.setValue(value); |
||||
} |
||||
|
||||
@Override |
||||
public void dispose() { |
||||
centerDialog.dispose(); |
||||
super.dispose(); |
||||
} |
||||
} |
@ -0,0 +1,93 @@
|
||||
package com.fr.design.gui.iprogressbar; |
||||
|
||||
import com.fr.design.border.UIRoundedBorder; |
||||
|
||||
import java.awt.AlphaComposite; |
||||
import java.awt.BasicStroke; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.Insets; |
||||
import java.awt.RenderingHints; |
||||
import java.awt.geom.RoundRectangle2D; |
||||
|
||||
/** |
||||
* 进度条带阴影的边框 |
||||
*/ |
||||
public class UIProgressBorder extends UIRoundedBorder { |
||||
private int left; |
||||
private int right; |
||||
private int top; |
||||
private int bottom; |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
public UIProgressBorder(Color color) { |
||||
super(color); |
||||
} |
||||
|
||||
public UIProgressBorder(Color color, int thickness) { |
||||
super(color, thickness); |
||||
} |
||||
|
||||
public UIProgressBorder(Color color, int thickness, int roundedCorners) { |
||||
super(color, thickness, roundedCorners); |
||||
} |
||||
|
||||
public UIProgressBorder(int lineStyle, Color color, int roundedCorners) { |
||||
super(lineStyle, color, roundedCorners); |
||||
} |
||||
|
||||
public UIProgressBorder(int lineStyle, Color color, int roundedCorners, int top, int left, int bottom, int right) { |
||||
super(lineStyle, color, roundedCorners); |
||||
this.top = top; |
||||
this.right = right; |
||||
this.bottom = bottom; |
||||
this.left = left; |
||||
} |
||||
|
||||
@Override |
||||
public Insets getBorderInsets(Component c) { |
||||
Insets insets = new Insets(top, left, bottom, right); |
||||
return insets; |
||||
} |
||||
|
||||
@Override |
||||
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { |
||||
Color oldColor = g.getColor(); |
||||
|
||||
Graphics2D g2d = (Graphics2D) g; |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g2d.setColor(getLineColor()); |
||||
g2d.fill(new RoundRectangle2D.Double(x, y, width, height, 0, 0)); |
||||
g2d.setColor(oldColor); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); |
||||
paintBorderShadow(g2d, 7, x, y, width, height); |
||||
|
||||
g2d.setColor(oldColor); |
||||
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1f)); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); |
||||
} |
||||
|
||||
private void paintBorderShadow(Graphics2D g2, int shadowWidth, int x, int y, int width, int height) { |
||||
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
shadowWidth = Math.max(shadowWidth, 2); |
||||
int sw = shadowWidth; |
||||
for (int i = sw; i > 0; i--) { |
||||
float pct = (float) (sw - i) / (sw - 1); |
||||
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.01f * i)); |
||||
g2.setColor(getMixedColor(Color.LIGHT_GRAY, 1.0f - pct, Color.WHITE, pct)); |
||||
g2.setStroke(new BasicStroke(i)); |
||||
g2.draw(new RoundRectangle2D.Double(x, y, width, height, getRoundedCorner(), getRoundedCorner())); |
||||
} |
||||
} |
||||
|
||||
private static Color getMixedColor(Color c1, float pct1, Color c2, float pct2) { |
||||
float[] clr1 = c1.getComponents(null); |
||||
float[] clr2 = c2.getComponents(null); |
||||
for (int i = 0; i < clr1.length; i++) { |
||||
clr1[i] = (clr1[i] * pct1) + (clr2[i] * pct2); |
||||
} |
||||
return new Color(clr1[0], clr1[1], clr1[2], clr1[3]); |
||||
} |
||||
} |
Loading…
Reference in new issue