【问题标题】:Java Shaped window with Outline带有大纲的 Java 形状窗口
【发布时间】:2012-05-20 19:37:49
【问题描述】:

我成功地渲染了一个多边形窗口。不过,我想用细笔勾勒它的轮廓。

是否可以在 Java 中勾勒出一个形状的窗口?

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

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

【问题讨论】:

    标签: java swing shaped-window


    【解决方案1】:

    我修改了您的代码以显示形状的窗口轮廓。

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

    请注意,我还使多边形变小了一些,因为我没有高清屏幕来适应您的原始多边形。

    最后我删除了事件处理代码,因为我无法理解你试图用鼠标点击做什么。有了这个工作起点,您可以再次添加您的事件处理代码。

    【讨论】:

    • 感谢 Andrew,但您的代码存在一些问题。它编译得很好,但是当使用 java 7 运行它时,我根本看不到多边形的轮廓!我现在要试试java 6。其次,存在事件处理代码的主要原因是因为它有助于在宽屏显示器 (1920x1080) 上打开和关闭选项卡。稍后我会将一些控件编码到打开的 Tab 中。
    • 首先,Andrew 刚刚编辑,是我回答了你的问题 :)) 这段代码是 Java 7 代码,它甚至不应该用 Java 6 编译。当你直接运行时会发生什么我在上面粘贴的代码,我的意思是没有修改?我问这个是因为它运行并显示带有红色轮廓的窗口。如果代码是这样工作的,那么我们就可以开始讨论代码的其他部分了。
    • 抱歉拖了这么久!是的,使用 Java6。它抱怨缺少使用与 Java7 版本不同的 API 的 AWTUtilities 类。
    • 您发布的代码是Java 7代码,但是如果您现在想使用Java 6,请查看:docs.oracle.com/javase/tutorial/uiswing/misc/…
    【解决方案2】:

    好的,添加导入,并取出半透明验证。当我运行此 Java6 代码时,红色轮廓显示

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

    【讨论】:

    • AWTUtilities 有替代品吗??
    【解决方案3】:

    我设法弄清楚如何用 Java 6 解决这个问题。似乎只是简单地在我的绘制方法中取出抗锯齿线就可以解决图形渲染故障,其中轮廓不够干净。这是完整的工作代码...

    问候 奥布里。

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

    【讨论】:

      猜你喜欢
      • 2015-09-05
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2017-01-09
      相关资源
      最近更新 更多