Java中全透明窗口的形状刷新
这是我的第一个问题,因为到目前为止我可以通过其他问题找到任何内容。我的问题来了: 我设计了一个窗户,上面有两个部分。左侧部分是完全透明的,我想在其上绘制一个可刷新的形状。 (在下文中,形状是正方形。)右侧部分始终是不透明的,我不会在其上绘制任何形状。一切正常,但对于左侧部分,背景形状不可刷新。
package haxbot;
import java.awt.*;
import java.awt.Robot.*;
import javax.swing.*;
import java.awt.image.*;
// import com.sun.awt.AWTUtilities;
public class drawScreen extends javax.swing.JFrame {
public drawScreen() {
initComponents();
}
//-------------------- automatically created ---------------------------------
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setAlwaysOnTop(true);
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
setResizable(false);
setUndecorated(true);
addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
formMouseMoved(evt);
}
});
jLabel1.setText("Position:");
jLabel2.setForeground(new java.awt.Color(255, 0, 0));
jLabel2.setText("[ 123, 134]");
jLabel5.setText("Color:");
jLabel6.setForeground(new java.awt.Color(255, 0, 0));
jLabel6.setText("[ 255, 255, 255]");
jButton1.setBackground(new java.awt.Color(255, 0, 0));
jButton1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
jButton1.setForeground(new java.awt.Color(255, 0, 0));
jButton1.setText("X");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(853, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(26, 26, 26)
.addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addComponent(jButton1, javax.swing.GroupLayout.Alignment.TRAILING)))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(58, 58, 58)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(jLabel1))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel6)
.addComponent(jLabel5))
.addContainerGap(338, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
//-------------------- automatically created (end) ---------------------------------
private void formMouseMoved(java.awt.event.MouseEvent evt) {
MousePos = evt.getPoint();
int mX = (int) MousePos.getX();
int mY = (int) MousePos.getY();
MousePos = evt.getPoint();
jLabel2.setText("[ " + mX + ", " + mY + " ]");
getColor(mX + (int) wind.getLocation().getX(), mY + (int) wind.getLocation().getY());
paint(this.getGraphics());
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
public Color getColor(int mX, int mY) {
try {
robot = new Robot();
} catch (AWTException awtE) {
awtE.printStackTrace();
}
Rectangle captureSize = new Rectangle(mX - 15, mY - 15, 30, 30);
img = robot.createScreenCapture(captureSize);
currColor = robot.getPixelColor(mX, mY);
for (int i = 0; i < img.getWidth(); i++) {
for (int j = 0; j < img.getHeight(); j++) {
int x = img.getRGB(i, j);
}
}
jLabel6.setText("[ " + currColor.getRed() + ", " + currColor.getGreen() + ", "
+ currColor.getBlue() + "]");
return currColor;
}
public static void main(String args[]) {
graphicsObtained = false;
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
wind = new drawScreen();
wind.setVisible(true);
wind.setLocation(182, 154);
wind.setDefaultCloseOperation(EXIT_ON_CLOSE);
try {
//UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(wind);
} catch (Exception ex) {
ex.printStackTrace();
}
// Add Transparency
// AWTUtilities.setWindowOpacity(wind, (float) 0.6);
currColors = new Color[10][10];
}
});
}
public void paint(Graphics g) {
leftScreen = (Graphics2D) g.create();
leftScreen.setClip(0, 0, 840, 410);
if (MousePos != null) {
//leftScreen.clearRect((int) MousePos.getX() - 150, (int) MousePos.getY() - 150, 300, 300);
leftScreen.drawRect((int) MousePos.getX() - 15, (int) MousePos.getY() - 15, 30, 30);
}
rightScreen = (Graphics2D) g.create();
rightScreen.setClip(850, 0, this.getWidth(), 410);
super.paint(rightScreen);
rightScreen.dispose();
leftScreen.dispose();
if (MousePos != null) {
//g2d1.clearRect(0, 0, 520, 430);
}
/*g2d.setColor(Color.red);
g2d.clearRect(55, 430, 90, 10);
if (MousePos != null)
g2d.drawString("[ " + MousePos.getX() + ", " + MousePos.getY() + " ]", 55, 440);
else
g2d.drawString("[ 0, 0 ]", 55, 440);*/
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
// End of variables declaration
private Point MousePos;
private Point PlayerPos;
private Color currColor;
private static Color[][] currColors;
private static drawScreen wind;
private BufferedImage img;
private static boolean graphicsObtained;
private Graphics initialSection;
private Graphics2D leftScreen, rightScreen;
Robot robot = null;
}
---------------------- 编辑(第二个代码) ---------------------- --------------------
import java.awt.event.MouseEvent;
import javax.swing.*;
import java.awt.*;
// 3) Now in your class (which extends JFrame)
public class JFrameTrial extends JFrame {
public static void main(String[] args) {
MousePos = new Point(0, 0);
JFrameTrial jft = new JFrameTrial();
jft.setDefaultCloseOperation(EXIT_ON_CLOSE);
jft.setSize(300, 300);
jft.setVisible(true);
}
public JFrameTrial() {
/* 4) set the contentPane using setContentPane
as the class you just created extending JComponent.*/
jct = new JComponentTrial(150, 150);
setContentPane(jct);
addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
MousePos = e.getPoint();
getContentPane().repaint();
}
});
}
private JComponentTrial jct;
private static Point MousePos;
// 1) But what you have to do is create a class which extends JComponent.
private class JComponentTrial extends JComponent {
public JComponentTrial(int x, int y) {
setSize(x, y);
}
// 2)There override the paintComponent() method with whatever you want to draw.
@Override
public void paintComponent(Graphics g) {
Graphics gg = g.create();
gg.setColor(Color.red);
gg.drawRect((int) MousePos.getX() - 15,
(int) MousePos.getY() - 15, 30, 30);
gg.dispose();
}
}
}
this is my first question since I could find anything by the other questions so far. Here comes my question:
I designed a window on which I have two portions. The left portion is fully transparent and I want to draw a refrashable shape on it. (In the following, the shapw is a square.) The right portion is always opaque and I won't draw any shape on it. Everything is OK but for the left portion, background shape is not refrashable.
package haxbot;
import java.awt.*;
import java.awt.Robot.*;
import javax.swing.*;
import java.awt.image.*;
// import com.sun.awt.AWTUtilities;
public class drawScreen extends javax.swing.JFrame {
public drawScreen() {
initComponents();
}
//-------------------- automatically created ---------------------------------
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setAlwaysOnTop(true);
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
setResizable(false);
setUndecorated(true);
addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
formMouseMoved(evt);
}
});
jLabel1.setText("Position:");
jLabel2.setForeground(new java.awt.Color(255, 0, 0));
jLabel2.setText("[ 123, 134]");
jLabel5.setText("Color:");
jLabel6.setForeground(new java.awt.Color(255, 0, 0));
jLabel6.setText("[ 255, 255, 255]");
jButton1.setBackground(new java.awt.Color(255, 0, 0));
jButton1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
jButton1.setForeground(new java.awt.Color(255, 0, 0));
jButton1.setText("X");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(853, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(26, 26, 26)
.addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addComponent(jButton1, javax.swing.GroupLayout.Alignment.TRAILING)))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(58, 58, 58)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(jLabel1))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel6)
.addComponent(jLabel5))
.addContainerGap(338, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
//-------------------- automatically created (end) ---------------------------------
private void formMouseMoved(java.awt.event.MouseEvent evt) {
MousePos = evt.getPoint();
int mX = (int) MousePos.getX();
int mY = (int) MousePos.getY();
MousePos = evt.getPoint();
jLabel2.setText("[ " + mX + ", " + mY + " ]");
getColor(mX + (int) wind.getLocation().getX(), mY + (int) wind.getLocation().getY());
paint(this.getGraphics());
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
public Color getColor(int mX, int mY) {
try {
robot = new Robot();
} catch (AWTException awtE) {
awtE.printStackTrace();
}
Rectangle captureSize = new Rectangle(mX - 15, mY - 15, 30, 30);
img = robot.createScreenCapture(captureSize);
currColor = robot.getPixelColor(mX, mY);
for (int i = 0; i < img.getWidth(); i++) {
for (int j = 0; j < img.getHeight(); j++) {
int x = img.getRGB(i, j);
}
}
jLabel6.setText("[ " + currColor.getRed() + ", " + currColor.getGreen() + ", "
+ currColor.getBlue() + "]");
return currColor;
}
public static void main(String args[]) {
graphicsObtained = false;
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
wind = new drawScreen();
wind.setVisible(true);
wind.setLocation(182, 154);
wind.setDefaultCloseOperation(EXIT_ON_CLOSE);
try {
//UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(wind);
} catch (Exception ex) {
ex.printStackTrace();
}
// Add Transparency
// AWTUtilities.setWindowOpacity(wind, (float) 0.6);
currColors = new Color[10][10];
}
});
}
public void paint(Graphics g) {
leftScreen = (Graphics2D) g.create();
leftScreen.setClip(0, 0, 840, 410);
if (MousePos != null) {
//leftScreen.clearRect((int) MousePos.getX() - 150, (int) MousePos.getY() - 150, 300, 300);
leftScreen.drawRect((int) MousePos.getX() - 15, (int) MousePos.getY() - 15, 30, 30);
}
rightScreen = (Graphics2D) g.create();
rightScreen.setClip(850, 0, this.getWidth(), 410);
super.paint(rightScreen);
rightScreen.dispose();
leftScreen.dispose();
if (MousePos != null) {
//g2d1.clearRect(0, 0, 520, 430);
}
/*g2d.setColor(Color.red);
g2d.clearRect(55, 430, 90, 10);
if (MousePos != null)
g2d.drawString("[ " + MousePos.getX() + ", " + MousePos.getY() + " ]", 55, 440);
else
g2d.drawString("[ 0, 0 ]", 55, 440);*/
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
// End of variables declaration
private Point MousePos;
private Point PlayerPos;
private Color currColor;
private static Color[][] currColors;
private static drawScreen wind;
private BufferedImage img;
private static boolean graphicsObtained;
private Graphics initialSection;
private Graphics2D leftScreen, rightScreen;
Robot robot = null;
}
---------------------- EDIT (Second Code) -------------------------------------------
import java.awt.event.MouseEvent;
import javax.swing.*;
import java.awt.*;
// 3) Now in your class (which extends JFrame)
public class JFrameTrial extends JFrame {
public static void main(String[] args) {
MousePos = new Point(0, 0);
JFrameTrial jft = new JFrameTrial();
jft.setDefaultCloseOperation(EXIT_ON_CLOSE);
jft.setSize(300, 300);
jft.setVisible(true);
}
public JFrameTrial() {
/* 4) set the contentPane using setContentPane
as the class you just created extending JComponent.*/
jct = new JComponentTrial(150, 150);
setContentPane(jct);
addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
MousePos = e.getPoint();
getContentPane().repaint();
}
});
}
private JComponentTrial jct;
private static Point MousePos;
// 1) But what you have to do is create a class which extends JComponent.
private class JComponentTrial extends JComponent {
public JComponentTrial(int x, int y) {
setSize(x, y);
}
// 2)There override the paintComponent() method with whatever you want to draw.
@Override
public void paintComponent(Graphics g) {
Graphics gg = g.create();
gg.setColor(Color.red);
gg.drawRect((int) MousePos.getX() - 15,
(int) MousePos.getY() - 15, 30, 30);
gg.dispose();
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一些建议:
A few suggestions:
super.paintComponent(g);
对于 Swing,您需要重写
paintComponent()
而不是paint()
。您直接在顶层容器上绘图。考虑使用 JPanel。覆盖 JPanel 的paintComponent
。编辑
阅读您的反馈后,我想您需要做的是以下事情:
首先,要记住一些要点:
JFrame 不是 JComponent 的子类。所以它没有paintComponent()。并且paint不应该与Swing一起使用。因此您需要做一些不同的事情。
与所有顶级容器一样,
JFrame
也定义了许多窗格,其顶部是JRootPane
。JRootPane 由glass 组成窗格
、内容窗格
和分层窗格
。通常我们所做的只是创建一个类,它扩展一个组件,例如 JPanel。在该类中,我们重写paintComponent()
方法,这就是我们绘制事物的方式。然后我们只需将其添加到JFrame
的内容窗格中。但您需要做的是创建一个扩展
JComponent
的类。用你想要绘制的任何东西覆盖paintComponent()方法。现在,在您的类(扩展 JFrame)中,使用setContentPane
设置 contentPane 作为您刚刚创建的扩展 JComponent 的类。setContentPane
的结构是因此,您可以传递扩展
JComponent
的类的对象,因为JComponent
是 Container 的子类。您所做的只是在使用
getContentPane
后设置内容窗格的布局。但您还需要对其进行设置,以使其按照您希望的方式运行。通常我们不会这样做,因为我们直接使用add()
将组件添加到内容窗格中。我希望这会起作用。For Swing, you need to override
paintComponent()
and notpaint()
. You are drawing directly on a top level container. Consider using a JPanel. override thepaintComponent
of the JPanel.EDIT
After reading your feedback, I guess what you need to do is the following:
First, some points to remember:
JFrame is not a subclass of JComponent. So it does not have paintComponent().And paint shouldn't be used with Swing. So you need to do something different.
Like all top level containers,
JFrame
also defines a number of panes, at the top of which is theJRootPane
.JRootPane is made up of theglass pane
,thecontent pane
and thelayered pane
. Usually what we do is just create a class, which extends a component such as JPanel. In that class we override thepaintComponent()
method and that's how we paint things.then we just add it t the content pane of theJFrame
.But what you have to do is create a class which extends
JComponent
. There override the paintComponent() method with whatever you want to draw. Now in your class (which extends JFrame) set the contentPane usingsetContentPane
as the class you just created extending JComponent. The structure ofsetContentPane
isSo you can pass the object of a class which extends
JComponent
sinceJComponent
is a subclass of Container.What you have done is just set the layout of the content pane after using
getContentPane
. But you also need to set it in order for it to behave the way you want it to. Usually we don't do such a thing, because we add components to the content pane directly usingadd()
. I hope this will work.