장식되지 않은 jFrame에 그림자를 추가하고 싶습니다. 나는 그것을 어떻게하는지에 관해 모른다. 그 누구도 알고 있니?Netbeans의 장식되지 않은 JFrame에 그림자를 추가하는 방법
답변
이것은 "속임수"입니다. 이렇게하면 창 뒤에 그림자가 생기지 않으므로 내용 뒤에 그림자가 생기게됩니다.
이 방법은 윈도우를 꾸며 줄뿐만 아니라 투명하게 만듭니다. 대체 "내용 창"은 부분적으로 채워져 그림자 효과가 뒤에 나타납니다.
import com.jhlabs.image.GaussianFilter;
import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class TestImageDropShadow {
public static void main(String[] args) {
new TestImageDropShadow();
}
public TestImageDropShadow() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
frame.setBackground(new Color(0, 0, 0, 0));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new ShadowPane());
frame.setLayout(new BorderLayout());
frame.add(new JLabel(new ImageIcon("/you/own/pony")));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ShadowPane extends JPanel {
private BufferedImage shadow;
public ShadowPane() {
setOpaque(false);
setBorder(new EmptyBorder(10, 10, 10, 10));
}
@Override
public void invalidate() {
shadow = null;
super.invalidate();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Insets insets = getInsets();
int x = insets.left;
int y = insets.top;
int width = getWidth() - (insets.left + insets.right);
int height = getHeight() - (insets.top + insets.bottom);
if (shadow == null) {
// Try and "guess" the amount of shadow we can show...
int shadowWidth = Math.min(Math.min(insets.left, insets.top), Math.min(insets.right, insets.bottom));
shadow = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = shadow.createGraphics();
g2d.setColor(getBackground());
g2d.fillRect(0, 0, width, height);
g2d.dispose();
shadow = generateShadow(shadow, shadowWidth, Color.BLACK, 0.5f);
}
System.out.println(insets);
g.drawImage(shadow, 0, 0, this);
g.setColor(getBackground());
g.fillRect(x, y, width, height);
}
}
public static void applyQualityRenderingHints(Graphics2D g2d) {
g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
}
public static BufferedImage createCompatibleImage(int width, int height) {
return createCompatibleImage(width, height, Transparency.TRANSLUCENT);
}
public static BufferedImage createCompatibleImage(int width, int height, int transparency) {
BufferedImage image = getGraphicsConfiguration().createCompatibleImage(width, height, transparency);
image.coerceData(true);
return image;
}
public static BufferedImage createCompatibleImage(BufferedImage image) {
return createCompatibleImage(image, image.getWidth(), image.getHeight());
}
public static BufferedImage createCompatibleImage(BufferedImage image,
int width, int height) {
return getGraphicsConfiguration().createCompatibleImage(width, height, image.getTransparency());
}
public static GraphicsConfiguration getGraphicsConfiguration() {
return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
}
public static BufferedImage generateBlur(BufferedImage imgSource, int size, Color color, float alpha) {
GaussianFilter filter = new GaussianFilter(size);
int imgWidth = imgSource.getWidth();
int imgHeight = imgSource.getHeight();
BufferedImage imgBlur = createCompatibleImage(imgWidth, imgHeight);
Graphics2D g2 = imgBlur.createGraphics();
applyQualityRenderingHints(g2);
g2.drawImage(imgSource, 0, 0, null);
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN, alpha));
g2.setColor(color);
g2.fillRect(0, 0, imgSource.getWidth(), imgSource.getHeight());
g2.dispose();
imgBlur = filter.filter(imgBlur, null);
return imgBlur;
}
public static BufferedImage generateShadow(BufferedImage imgSource, int size, Color color, float alpha) {
int imgWidth = imgSource.getWidth() + (size * 2);
int imgHeight = imgSource.getHeight() + (size * 2);
BufferedImage imgMask = createCompatibleImage(imgWidth, imgHeight);
Graphics2D g2 = imgMask.createGraphics();
applyQualityRenderingHints(g2);
int x = Math.round((imgWidth - imgSource.getWidth())/2f);
int y = Math.round((imgHeight - imgSource.getHeight())/2f);
g2.drawImage(imgSource, x, y, null);
g2.dispose();
// ---- Blur here ---
BufferedImage imgGlow = generateBlur(imgMask, (size * 2), color, alpha);
return imgGlow;
}
}
은 기본적으로 여기에 무슨 일이 우리가 처음 widnow 투명을한다. 다음으로 컨텐츠 창을 우리 자신의 특별한
ShadowPane
으로 바꿉니다.
이 패널은 투명하며 EmptyBorder
이 적용됩니다. 이렇게하면 추가 된 모든 것이 우리가 원하는 영역 내에 들어갈 수 있습니다.
다음으로 구성 요소의 사용 가능한 전체 공간을 나타내는 BufferedImage
을 생성하지만 "가시 영역"만 채 웁니다. 우리는 이것에 그림자를 적용하고 그것을 구성 요소에 칠합니다. ,
이 예는 JHLabs
에서 GaussianFilter
의 사용은 엄격하게 당신이 그것을 필요가 없습니다, 말하기하게,하지만 좀 더 복잡한 무언가의 예를 들어 좋은 "퍼지"효과
제공하지 않습니다 당신은 좀 봐 줄 수 있습니다 Java: create shadow effect on image
"이 정적 메소드는 getGraphicsConfiguration() 메소드의"Component에서 인스턴스 메소드를 숨길 수 없다. "라고 알려줍니다. 모든 메서드에서 '정적'을 제거하면 실행되지만 투명한 효과는 실행되지 않습니다. – tomyforever
getGraphicsConfiguration2()로 변경했지만 그림에 표시되는 테두리 투명 효과를 얻을 수 없습니다. – tomyforever
해결되었지만 제 JDialog 배경색이었습니다. 나는 '새로운 Color (0,0,0,0)'이 'Color.white'와 다르다는 것을 깨닫지 못했다. – tomyforever
- 1. 장식되지 않은 JFrame에 캔버스가 있습니까?
- 2. 장식되지 않은 JFrame 그림자
- 3. NetBeans의 JFrame에 Panel을 추가하는 중 오류가 발생했습니다.
- 4. JPanel을 Netbeans의 JFrame에 추가하려면 어떻게해야합니까?
- 5. JFrame에 JPanel을 추가하는 방법
- 6. Keylistener를 JFrame에 추가하는 방법
- 7. JFrame에 아이콘을 추가하는 방법
- 8. 그림자를 추가하는 방법, 핵심 그래픽
- 9. netbeans의 jframe에 비디오 또는 애니메이션 추가하기
- 10. 장식되지 않은 프레임의 배경색은 어떻게 변경합니까?
- 11. Netbeans의 스윙을 사용하여 JLrame을 JFrame에 연결하는 방법 드래그 앤 드롭
- 12. JFrame에 애니메이션을 구현하는 방법
- 13. JFrame.setExtendedState (MAXIMIZED_BOTH)가 장식되지 않은 프레임에서 작동합니까?
- 14. CSS를 사용하여 테이블에 텍스트 그림자를 추가하는 방법
- 15. dc.js 막대 차트 rect에 그림자를 추가하는 방법
- 16. 마스크를 사용하여 UIView에 그림자를 추가하는 방법
- 17. <rect>에 그림자를 추가하는 방법
- 18. Android : 앱 위젯에 그림자를 추가하는 방법
- 19. RichTextBox의 텍스트에 그림자를 추가하는 방법 C#
- 20. UIPopoverBackgroundView를 구현하는 팝업에 그림자를 추가하는 방법
- 21. 안드로이드 - 사용자 정의 MyLocationOverlay에 그림자를 추가하는 방법
- 22. selectedBackgroundView에 그림자를 추가하는 방법 UITableViewCell Swift
- 23. Textblock에 흐리게 처리하지 않는 그림자를 추가하는 방법
- 24. 장식되지 않은 JFrame의 불투명도는 어떻게 설정합니까?
- 25. Firefox - 장식되지 않은 확인란에서 테두리 제거
- 26. eclipse 플러그인 클래스를 사용하여 장식되지 않은 창
- 27. 장식되지 않은 창에 Windows 스냅 기능이 있습니까?
- 28. Netbeans의 목록 상자에 배열 문자열을 추가하는 방법
- 29. netbeans의 데이터베이스 테이블에 txt 파일을 추가하는 방법
- 30. NetBeans의 Ant에 hbm2java 작업을 추가하는 방법
* "나는 장식되지 않은 jFrame에 그림자를 추가하고 싶습니다"*? 창 뒤쪽이나 창 내부에 그림자를 추가하고 싶습니까? – MadProgrammer
@MadProgrammer 우리는 여기에 게시 한 이미지/스크린 샷에 그림자를 추가하는 방법을 알고 있습니다. 나는 그것이 그가 (뒤에) 의미하는 것이라고 생각한다. 다른 포럼에서 예제를 보여주는이 질문을 보았습니다. 답변을 찾지 못했습니다. 단지 질문 만 할 수 있습니다. –
@MadPegrammer. 나는 창문 뒤에서 언급했다. – realProgrammer