gpt4 book ai didi

java - 在根容器中分层多个 GlassPane

转载 作者:搜寻专家 更新时间:2023-11-01 03:43:31 25 4
gpt4 key购买 nike

是否可以为单个 JFrame 添加多个 GlassPane,或者我必须使用不舒服的 LayeredPane不透明度 属性。

我附上了一些显示我想做什么的代码(由@camickr 提供)。

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;

public class MultiplayGlassPane {

private static final long serialVersionUID = 1L;
private JFrame frame = new JFrame("frameTitle");
private JPanel fPanel = new JPanel();
private Random random = new Random();
private final static Border MESSAGE_BORDER = new EmptyBorder(10, 10, 10, 10);
private JLabel message = new JLabel();
private ArrayList<Star> stars = new ArrayList<Star>();

public MultiplayGlassPane() {

MyGlassPane glass = new MyGlassPane();
for (int i = 0; i < 35; i++) {
Star star = new Star(new Point(random.nextInt(580), random.nextInt(550)));
star.setColor(Color.orange);
star.setxIncr(-3 + random.nextInt(7));
star.setyIncr(-3 + random.nextInt(7));
glass.add(star);
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(glass, BorderLayout.CENTER);
frame.setLocation(20, 20);
frame.pack();
frame.setVisible(true);

DisabledGlassPane1 glassPane = new DisabledGlassPane1();
JRootPane rootPane = SwingUtilities.getRootPane(frame);
rootPane.setGlassPane(glassPane);
glassPane.activate("");
}

private class MyGlassPane extends JLabel {

private static final long serialVersionUID = 1L;
private ArrayList<Star> stars = new ArrayList<Star>();
private javax.swing.Timer timer = new javax.swing.Timer(20, new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
for (Star star : stars) {
star.move();
}
repaint();
}
});

public void stopAnimation() {
if (timer.isRunning()) {
timer.stop();
}
}

public void startAnimation() {
if (!timer.isRunning()) {
timer.start();
}
}

@Override
public void addNotify() {
super.addNotify();
timer.start();
}

@Override
public void removeNotify() {
super.removeNotify();
timer.stop();
}

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

public MyGlassPane() {
this.setPreferredSize(new Dimension(620, 620));
}

public void add(Star star) {
stars.add(star);
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for (Star star : stars) {
g.setColor(star.getColor());
g.fillPolygon(star);
}
}
}

class DisabledGlassPane1 extends JComponent implements KeyListener {

private static final long serialVersionUID = 1L;

public DisabledGlassPane1() {
setOpaque(false);
Color base = UIManager.getColor("inactiveCaptionBorder");
Color background = new Color(base.getRed(), base.getGreen(), base.getBlue(), 128);
setBackground(background);
setLayout(new GridBagLayout());
add(message, new GridBagConstraints());
message.setOpaque(true);
message.setBorder(MESSAGE_BORDER);
addMouseListener(new MouseAdapter() {
});
addMouseMotionListener(new MouseMotionAdapter() {
});
addKeyListener(this);
setFocusTraversalKeysEnabled(false);
Random random = new Random();
for (int i = 0; i < 50; i++) {
Star star = new Star(new Point(random.nextInt(490), random.nextInt(490)));
star.setColor(Color.magenta);
star.setxIncr(-3 + random.nextInt(7));
star.setyIncr(-3 + random.nextInt(7));
add(star);
}
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for (Star star : stars) {
g.setColor(star.getColor());
g.fillPolygon(star);
}
}

@Override
public void setBackground(Color background) {
super.setBackground(background);
Color messageBackground = new Color(background.getRGB());
message.setBackground(messageBackground);
}

public void keyPressed(KeyEvent e) {
e.consume();
}

public void keyTyped(KeyEvent e) {
}

public void keyReleased(KeyEvent e) {
e.consume();
}

public void activate(String text) {
if (text != null && text.length() > 0) {
message.setVisible(true);
message.setText(text);
message.setForeground(getForeground());
} else {
message.setVisible(false);
}
setVisible(true);
//setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
requestFocusInWindow();
}

public void deactivate() {
setCursor(null);
setVisible(false);
}
private javax.swing.Timer timer = new javax.swing.Timer(15, new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
for (Star star : stars) {
star.move();
}
repaint();
}
});

public void stopAnimation() {
if (timer.isRunning()) {
timer.stop();
}
}

public void startAnimation() {
if (!timer.isRunning()) {
timer.start();
}
}

@Override
public void addNotify() {
super.addNotify();
timer.start();
}

@Override
public void removeNotify() {
super.removeNotify();
timer.stop();
}

public void add(Star star) {
stars.add(star);
}
}

private class Star extends Polygon {

private static final long serialVersionUID = 1L;
private Point location = null;
private Color color = Color.YELLOW;
private int xIncr, yIncr;
static final int WIDTH = 600, HEIGHT = 600;

Star(Point location) {
int x = location.x;
int y = location.y;
this.location = location;
this.addPoint(x, y + 8);
this.addPoint(x + 8, y + 8);
this.addPoint(x + 11, y);
this.addPoint(x + 14, y + 8);
this.addPoint(x + 22, y + 8);
this.addPoint(x + 17, y + 12);
this.addPoint(x + 21, y + 20);
this.addPoint(x + 11, y + 14);
this.addPoint(x + 3, y + 20);
this.addPoint(x + 6, y + 12);
}

public void setColor(Color color) {
this.color = color;
}

public void move() {
if (location.x < 0 || location.x > frame.getContentPane().getWidth() - 20) {
xIncr = -xIncr;
}
if (location.y < 0 || location.y > frame.getContentPane().getHeight() - 20) {
yIncr = -yIncr;
}
translate(xIncr, yIncr);
location.setLocation(location.x + xIncr, location.y + yIncr);
}

public void setxIncr(int xIncr) {
this.xIncr = xIncr;
}

public void setyIncr(int yIncr) {
this.yIncr = yIncr;
}

public Color getColor() {
return color;
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
MultiplayGlassPane Mpgp = new MultiplayGlassPane();
}
});
}
}

最佳答案

http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html有关根 Pane 的解释以及 Glass Pane 的实际含义。

玻璃 Pane 只是一种添加组件的便捷方式,它具有根 Pane 的大小,并且阻止所有输入事件。这使您可以捕获与组件的任何交互以创建“请稍候...”屏幕。

每个根容器只有一个玻璃 Pane 。 您不能将玻璃板分层

如果你想在当前玻璃面板上叠加一些东西,你可以用其他东西替换玻璃面板的内容。您还可以将 JPanel 设置为玻璃 Pane ,这允许您在玻璃 Pane 中布局多个组件。

通常,您应该只使用玻璃 Pane 来阻止用户输入(并且,如果需要,显示某种“请稍候”消息)。您能否提供一个用例,说明为什么要将玻璃板彼此叠放?

关于java - 在根容器中分层多个 GlassPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com