Jakie są zasadnicze różnice między używaniem ramki AWT i Swing JFrame podczas implementacji własnego renderowania, a nie przy użyciu standardowych komponentów Java GUI?Swing/JFrame vs AWT/Frame dla renderowania poza EDT
To jest kontynuacją poprzedniego pytania:
AWT custom rendering - capture smooth resizes and eliminate resize flicker
Typowe punkty rozmawiać na Swing vs AWT nie wydają się zastosować, ponieważ używamy tylko ramek. Heavyweight vs Lightweight wychodzi przez okno (i JFrame rozszerza Frame), na przykład.
Więc co jest najlepsze, JFrame lub Frame dla tej sytuacji? Czy ma jakąś znaczącą różnicę?
Uwaga: ten scenariusz to taki, w którym renderowanie w EDT nie jest pożądane. Istnieje przepływ pracy aplikacji, który nie jest powiązany z EDT, a renderowanie odbywa się zgodnie z potrzebami poza EDT. Synchronizowanie renderowania z EDT spowodowałoby opóźnienie renderowania. Nie renderujemy żadnych komponentów Swing ani AWT innych niż Frame lub JFrame (lub dołączonego JPanel/Component/etc, jeśli jest najlepszy).
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.image.BufferStrategy;
import java.awt.Frame;
public class SmoothResize extends Frame {
public static void main(String[] args) {
Toolkit.getDefaultToolkit().setDynamicLayout(true);
System.setProperty("sun.awt.noerasebackground", "true");
SmoothResize srtest = new SmoothResize();
//srtest.setIgnoreRepaint(true);
srtest.setSize(100, 100);
srtest.setVisible(true);
}
public SmoothResize() {
render();
}
private Dimension old_size = new Dimension(0, 0);
private Dimension new_size = new Dimension(0, 0);
public void validate() {
super.validate();
new_size.width = getWidth();
new_size.height = getHeight();
if (old_size.equals(new_size)) {
return;
} else {
render();
}
}
public void paint(Graphics g) {
validate();
}
public void update(Graphics g) {
paint(g);
}
public void addNotify() {
super.addNotify();
createBufferStrategy(2);
}
protected synchronized void render() {
BufferStrategy strategy = getBufferStrategy();
if (strategy == null) {
return;
}
// Render single frame
do {
// The following loop ensures that the contents of the drawing buffer
// are consistent in case the underlying surface was recreated
do {
Graphics draw = strategy.getDrawGraphics();
Insets i = getInsets();
int w = (int)(((double)(getWidth() - i.left - i.right))/2+0.5);
int h = (int)(((double)(getHeight() - i.top - i.bottom))/2+0.5);
draw.setColor(Color.YELLOW);
draw.fillRect(i.left, i.top + h, w,h);
draw.fillRect(i.left + w, i.top, w,h);
draw.setColor(Color.BLACK);
draw.fillRect(i.left, i.top, w, h);
draw.fillRect(i.left + w, i.top + h, w,h);
draw.dispose();
// Repeat the rendering if the drawing buffer contents
// were restored
} while (strategy.contentsRestored());
// Display the buffer
strategy.show();
// Repeat the rendering if the drawing buffer was lost
} while (strategy.contentsLost());
}
}
Niektóre metody 'Nested and Inherit' z' Frame' są zaimplementowane bezpośrednio w 'JFrame API' http://download.oracle.com/javase/6/docs/api/javax/swing/JFrame.html, – mKorbel
Nie widzę żadnych różnic między 'Frame' i' JFrame' oraz 'MsExcell' i' MozillaFirefox', należy usunąć 'notify' jeśli jest to zrobione (i3/530/3,43 Gb RAM, WinXP, OnBoard GPU/no sharedMemory/compiled JDK1.6.22) – mKorbel
@mKorbel: Co MsExcel i MozillaFirefox mają wspólnego z czymkolwiek? –