带轮廓的Java形窗口
我正在成功渲染多边形窗口。然而,我想用一笔细细的笔触来概括它 可以用Java勾勒出一个成形窗口的轮廓吗 这是我的工作代码,我正在使用ComponentResistized方法设置窗口的形状。但是,如果有任何其他方法可以获得轮廓,无论是在最小化选项卡窗口时还是在最大化选项卡窗口时,请提供帮助带轮廓的Java形窗口,java,swing,shaped-window,Java,Swing,Shaped Window,我正在成功渲染多边形窗口。然而,我想用一笔细细的笔触来概括它 可以用Java勾勒出一个成形窗口的轮廓吗 这是我的工作代码,我正在使用ComponentResistized方法设置窗口的形状。但是,如果有任何其他方法可以获得轮廓,无论是在最小化选项卡窗口时还是在最大化选项卡窗口时,请提供帮助 //LongTab.java //Desktop Tab import java.awt.*; import java.awt.event.*; import javax.swing.*; import j
//LongTab.java
//Desktop Tab
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import static java.awt.GraphicsDevice.WindowTranslucency.*;
public class LongTab extends JWindow implements MouseListener{
static LongTab t;
Boolean isVisible = false;
final static BasicStroke stroke = new BasicStroke(2.0f);
GeneralPath path;
public LongTab(){
addMouseListener(this);
setSize(500, 1080);
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e){
Polygon polygon = new Polygon();
polygon = new Polygon();
polygon.addPoint(40, 1080);
polygon.addPoint(40, 700);
polygon.addPoint(20, 690);
polygon.addPoint(20, 400);
polygon.addPoint(40, 390);
polygon.addPoint(40, 0);
polygon.addPoint(500, 0);
polygon.addPoint(500, 1080);
path = new GeneralPath();
path.append(polygon, true);
setShape(path);
}
});
setSize(40, 1080);
setLocation(1880, 0);
}
public void mouseClicked (MouseEvent me) {
if(!isVisible) {
isVisible=true;
t.setSize(400, 1080);
t.setLocation(1520, 0);
return;
}
if(isVisible) {
isVisible=false;
t.setSize(40, 1080);
t.setLocation(1880, 0);
}
return;
}
public void mouseEntered (MouseEvent me) {
}
public void mousePressed (MouseEvent me) {
}
public void mouseReleased (MouseEvent me) {
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(stroke);
//if(!isVisible)
//g2.draw(path);
//repaint();
}
public void mouseExited (MouseEvent me) {
}
public static void main (String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
//If shaped windows aren't supported, exit.
if (!gd.isWindowTranslucencySupported(PERPIXEL_TRANSPARENT)) {
System.err.println("Shaped windows are not supported");
System.exit(0);
} else {
t = new LongTab();
t.setVisible(true)
}
}
});
}
}
我修改了您的代码以显示成形的窗口轮廓
//LongTab.java
//Desktop Tab
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsDevice.WindowTranslucency;
import java.awt.GraphicsEnvironment;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.geom.GeneralPath;
import javax.swing.JFrame;
public class LongTab extends JFrame{
private Polygon polygon;
public LongTab() {
setSize(500, 720);
setLocation(10, 10);
setUndecorated(true);
polygon = new Polygon();
polygon = new Polygon();
polygon.addPoint(40, 720);
polygon.addPoint(40, 700);
polygon.addPoint(20, 690);
polygon.addPoint(20, 400);
polygon.addPoint(40, 390);
polygon.addPoint(40, 20);
polygon.addPoint(500, 20);
polygon.addPoint(500, 720);
GeneralPath path = new GeneralPath();
path.append(polygon, true);
setShape(path);
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(2.0f));
g2.setColor(Color.RED);
g2.draw(polygon);
}
public static void main(String[] args) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
// If shaped windows aren't supported, exit.
if (!gd.isWindowTranslucencySupported(WindowTranslucency.PERPIXEL_TRANSLUCENT)) {
System.err.println("Shaped windows are not supported");
System.exit(0);
} else {
new LongTab().setVisible(true);
}
}
}
请注意,我还使多边形稍微小一些,因为我没有高清屏幕来适应您的原始多边形
最后,我删除了事件处理代码,因为我无法理解您试图用鼠标单击来做什么。使用此工作起点,您可以再次添加事件处理代码。确定,添加了导入,并执行了半透明验证。当我运行这个Java6代码时,红色的轮廓显示为,我设法找出了如何用Java6解决这个问题。在我的绘制方法中,似乎只是简单地去掉了抗锯齿线就解决了图形渲染的问题,即轮廓不够清晰。这是完整的工作代码 问候 奥布里
谢谢Andrew,但是你的代码有几个问题。它编译得很好,但是当用Java7运行它时,我根本看不到多边形的轮廓!我现在要试试Java6。其次,事件处理代码存在的主要原因是它有助于打开和关闭宽屏显示器(1920x1080)上的选项卡。稍后,我会将一些控件编码到open选项卡中。首先,Andrew刚刚编辑,是我回答了你的问题:))这段代码是Java 7代码,它甚至不应该用Java 6编译。当您直接运行我上面粘贴的代码时会发生什么,我的意思是不做任何修改?我这样问是因为它运行并显示带有红色轮廓的窗口。如果代码是这样工作的,那么我们就可以开始讨论代码的其他部分了。很抱歉花了这么长时间!是的,使用Java6。它抱怨AWTUtilities类丢失,该类使用了与Java7版本不同的API。您发布的代码是Java7代码,但是如果您现在想使用Java6,请检查这里:AWTUtilities是否有替代方案??
//LongTab.java
//Desktop Tab
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
//import java.awt.GraphicsDevice.WindowTranslucency;
import java.awt.GraphicsEnvironment;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.geom.GeneralPath;
import javax.swing.JFrame;
import com.sun.awt.AWTUtilities.*;
public class LongTab extends JFrame{
private Polygon polygon;
public LongTab() {
setSize(500, 720);
setLocation(10, 10);
setUndecorated(true);
polygon = new Polygon();
polygon = new Polygon();
polygon.addPoint(40, 720);
polygon.addPoint(40, 700);
polygon.addPoint(20, 690);
polygon.addPoint(20, 400);
polygon.addPoint(40, 390);
polygon.addPoint(40, 20);
polygon.addPoint(500, 20);
polygon.addPoint(500, 720);
GeneralPath path = new GeneralPath();
path.append(polygon, true);
com.sun.awt.AWTUtilities.setWindowShape(this, path);
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(2.0f));
g2.setColor(Color.RED);
g2.draw(polygon);
}
public static void main(String[] args) {
//GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
//GraphicsDevice gd = ge.getDefaultScreenDevice();
// If shaped windows aren't supported, exit.
//if (!gd.isWindowTranslucencySupported(WindowTranslucency.PERPIXEL_TRANSLUCENT)) {
// System.err.println("Shaped windows are not supported");
// System.exit(0);
//} else {
new LongTab().setVisible(true);
//}
}
}
//LongTab.java
//Desktop Tab
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import com.sun.awt.AWTUtilities.*;
public class LongTab extends JWindow implements MouseListener{
static LongTab t;
Boolean isVisible = false;
GeneralPath closed;
final static BasicStroke stroke = new BasicStroke(2.0f);
GeneralPath path;
//Constructor
public LongTab(){
addMouseListener(this);
setSize(500, 1080);
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e){
Polygon polygon = new Polygon();
polygon = new Polygon();
polygon.addPoint(40, 1080);
polygon.addPoint(40, 700);
polygon.addPoint(20, 690);
polygon.addPoint(20, 400);
polygon.addPoint(40, 390);
polygon.addPoint(40, 0);
polygon.addPoint(500, 0);
polygon.addPoint(500, 1080);
path = new GeneralPath();
path.append(polygon, true);
//setShape(path);
com.sun.awt.AWTUtilities.setWindowShape(t, path);
}});
setSize(40, 1080);
setLocation(1880, 0);
}//end of constructor.
public void mouseClicked (MouseEvent me) {
if(!isVisible){
isVisible=true;
t.setSize(400, 1080);
t.setLocation(1520, 0);
return;
}
if(isVisible){
isVisible=false;
t.setSize(40, 1080);
t.setLocation(1880, 0);
}
return;
}
public void mouseEntered (MouseEvent me) {}
public void mousePressed (MouseEvent me) {}
public void mouseReleased (MouseEvent me) {}
public void mouseExited (MouseEvent me) {}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
//antialias commented out to fix outline glitch.
//g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(stroke);
g2.drawLine(40, 1080, 40, 700);
g2.drawLine(40, 700, 20, 690);
g2.drawLine(20, 690, 20, 400);
g2.drawLine(20, 400, 40,390);
g2.drawLine(40, 390, 40, 0);
}
public static void main (String[] args){
t = new LongTab();
t.setVisible(true);
}
}