Окно в форме Java с контуром

Я успешно рендеринг окна в форме многоугольника. Тем не менее, я хотел бы обрисовать это тонким штрихом.

Можно ли очертить фасонное окно в 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)
        }
      }
    });
  }
}

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

}

Я изменил ваш код для отображения формы окна.

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

Обратите внимание, что я также сделал многоугольник несколько меньше, потому что у меня нет экрана HD, чтобы соответствовать исходному многоугольнику.

Наконец, я удалил код обработки событий, потому что не мог понять, что вы пытаетесь делать с помощью щелчков мышью. С этой рабочей отправной точкой вы можете снова добавить свой код обработки событий.

Хорошо, добавил импорт и удалил проверку прозрачности. Когда я запускаю этот код Java6, красный контур отображается в течение <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;
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);
    //}
}
}
Другие вопросы по тегам