2012-05-20 3 views
4

Я успешно создаю окно в форме многоугольника. Тем не менее, я хотел бы описать его с тонким ударом.Java Shaped window with Outline

Возможно ли очертить форматированное окно на Java?

Вот мой рабочий код, я использую метод componentResized для установки формы для окна. Однако, если есть какой-либо другой способ, чтобы получить схему, как для минимизации Tab-Window, так и при максимальном использовании Tab-Window, пожалуйста, помогите.

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

ответ

0

мне удалось выяснить, как решить проблему с 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); 
    } 

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

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

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

+0

Спасибо, Андрей, но пара проблем с вашим кодом. Он компилируется нормально, но при запуске с помощью java 7 я вообще не вижу контура полигона! Я собираюсь попробовать java 6 сейчас. Во-вторых, главная причина, по которой работает код обработки событий, заключается в том, что он облегчает открытие и закрытие вкладки на широкоэкранном мониторе (1920x1080). Позже я буду вводить некоторые элементы управления в открытую вкладку. – aubreybourke

+0

Прежде всего, Андрей просто отредактировал, это я ответил на ваш вопрос :)) Этот код является кодом Java 7, он даже не должен компилироваться с Java 6. Что происходит, когда вы напрямую запускаете код, который я вставил выше, я имею в виду без изменений? Я спрашиваю об этом, потому что он работает и показывает окно с красным контуром. Если код работает таким образом, тогда мы можем начать говорить о других частях вашего кода. –

+0

Извините за то, что так долго! Да, используя Java6. Он жалуется на отсутствие класса AWTUtilities, который использует другой API для выпуска Java7. – aubreybourke

1

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

Есть ли альтернатива AWTUtilities? – Sorter