2010-06-25 2 views
2

Я надеюсь, что кто-то случайно наткнулся на следующий вопрос.Перелистывание страницы Java не поддерживается в Mac OS?

У моего приложения Java проблемы с производительностью графики на Mac, поэтому я сделал простое тестовое приложение (код ниже). Когда я запускаю это на Windows, консоль сообщает мне:

GraphicsConfiguration flipping? true
BufferStrategy flipping? правда

Когда я запускаю тот же самый код на Mac OS, я получаю:

GraphicsConfiguration листать? true
BufferStrategy flipping? false

Означает ли это, что в Mac OS перетаскивание страницы просто не поддерживается в оконном приложении? Есть ли какие-либо трюки, чтобы сделать работу с перелистыванием страницы на Mac OS без полного экрана?

Все указатели очень приветствуются,
Mattijs

Использование JDK 1.6 на Windows XP и Mac OS 10.5.

Код:

import java.awt.image.BufferStrategy; 
import javax.swing.*; 
import java.awt.*; 

public class Test { 
int width = 640; 
int height = 480; 

GraphicsEnvironment graphEnv = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
GraphicsDevice graphDevice = graphEnv.getDefaultScreenDevice(); 
GraphicsConfiguration graphicConf = graphDevice.getDefaultConfiguration(); 

public Test() { 
    JFrame jFrame = new JFrame(graphicConf); 
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jFrame.setTitle("double buffer test"); 
    jFrame.setResizable(false); 
    jFrame.setFocusTraversalKeysEnabled(false); 

    Canvas canvas = new Canvas(); 
    canvas.setSize(width, height); 
    canvas.setIgnoreRepaint(true); 

    jFrame.getContentPane().add(canvas); 
    jFrame.pack(); 
    jFrame.setVisible(true); 

    System.out.println("GraphicsConfiguration flipping? " + graphicConf.getBufferCapabilities().isPageFlipping()); 
    canvas.createBufferStrategy(2); 
    BufferStrategy bufferStrategy = canvas.getBufferStrategy(); 
    System.out.println("BufferStrategy flipping? " + bufferStrategy.getCapabilities().isPageFlipping()); 

    while(true) { 
    Graphics g = bufferStrategy.getDrawGraphics(); 
    g.setColor(Color.BLACK); 
    g.fillRect(0,0,width,height); 
    g.setColor(Color.RED); 
    g.drawLine((int)(Math.random()*width),(int)(Math.random()*height), 
       (int)(Math.random()*width),(int)(Math.random()*height)); 
    bufferStrategy.show(); 
    g.dispose(); 
    } 
} 

public static void main(String[] args) { 
    new Test(); 
} 
} 
+0

Это было некоторое время назад, но я успешно использовал страницы листать (не полный экран) в JOGL на Mac. – finnw

ответ

2

Плохая новость: я получаю тот же результат на той же конфигурации Mac OS X. Хорошие новости: isAccelerated() - это правда.

System.out.println("BufferStrategy accelerated? " + bufferStrategy 
    .getCapabilities().getFrontBufferCapabilities().isAccelerated()); 

Вместо Canvas и BufferStrategy, я просто использовать new JPanel(true).

Добавление: Например,

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class NewTest extends JPanel implements ActionListener, Runnable { 

    private Random r = new Random(); 
    private Timer t = new Timer(10, this); 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new NewTest()); 
    } 

    @Override 
    public void run() { 
     JFrame f = new JFrame("NewTest"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     t.start(); 
    } 

    public NewTest() { 
     super(true); 
     this.setPreferredSize(new Dimension(640, 480)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     int width = this.getWidth(); 
     int height = this.getHeight(); 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, width, height); 
     g.setColor(Color.RED); 
     g.drawLine(r.nextInt(width), r.nextInt(height), 
      r.nextInt(width), r.nextInt(height)); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     this.repaint(); 
    } 
} 
+0

Хотя я не знаю, почему, реализуя мое основное приложение, основанное на вашем примере кода, решает проблему с Cpu-головоломкой на Mac. У меня все еще есть некоторые артефакты для решения этой проблемы, когда я добавляю TextFields поверх отображаемого контента, но пока это кажется большим шагом вперед! Благодаря! – Mattijs

+0

@Mattijs: Мне нравится удобство и надежность 'javax.swing.Timer'. Если вы добавили компоненты в 'JPanel', попробуйте' super.paintComponent (g) 'вместо' fillRect() 'в' paintComponent() '. Обычно я просто добавляю другие компоненты поблизости. – trashgod

+0

Обновление: артефакты (небольшой диапазон пикселей вокруг TextFields, не перерисовываемых правильно) решаются с помощью JTextField. – Mattijs

 Смежные вопросы

  • Нет связанных вопросов^_^