带轮廓的Java形窗口

带轮廓的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

我正在成功渲染多边形窗口。然而,我想用一笔细细的笔触来概括它

可以用Java勾勒出一个成形窗口的轮廓吗

这是我的工作代码,我正在使用ComponentResistized方法设置窗口的形状。但是,如果有任何其他方法可以获得轮廓,无论是在最小化选项卡窗口时还是在最大化选项卡窗口时,请提供帮助

//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);
    }

}