我最近购买了Filthy Rich Clients这本书,我发现它非常有用和有趣.在本书的一个例子的基础上,我尝试实现一个自定义ScrollPane,它在要显示的组件的视图底部显示一个"阴影".我最终得到了下面的代码.它工作但不完美.特别是当我通过拖动滚动条滚动窗格时,一切正常,绘画非常流畅.但是当我用鼠标滚动滚动时,阴影闪烁,我不明白为什么.谁能帮我?
编辑:滚动窗格中的任何组件都会发生同样的事情.编辑代码以显示两个帧以查看问题.
编辑2:我已将问题与滚动窗格处理鼠标滚轮事件的方式隔离开来.滚动滚动窗格时,根据滚动的方向稍微向上或向下复制视口的内容,然后绘制进入视图的区域.我的代码使整个组件"脏"但是在组件移动了内容之后.所以你会立刻看到"影子"渐变不合适,直到发出重画.有关如何禁用此功能的任何想法?
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Container;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.RepaintManager;
public class Test {
public static void main(String[] args) {
JFrame f = new JFrame("Table");
JFrame f1 = new JFrame("Text Area");
Object[] names = new Object[] { "Title", "Artist", "Album" };
String[][] data = new String[][] {
{ "Los Angeles", "Sugarcult", "Lights Out" },
{ …Run Code Online (Sandbox Code Playgroud) 我在屏幕上使用Java2D绘制了一堆原语,我得到了很多撕裂/闪烁.
如何启用/使用双缓冲,以便将其从屏幕上拉出然后显示整个事物?
我正在用Java编写模拟,其中对象在牛顿物理学下运作.物体可以施加力,并且所产生的速度使其在屏幕上移动.模拟的本质意味着对象根据动画循环的当前和上一次迭代之间的时间间隔以不连续的步骤移动; 例如
public void animationLoop() {
long prev = System.currentTimeMillis();
long now;
while(true) {
long now = System.currentTimeMillis();
long deltaMillis = now - prev;
prev = now;
if (deltaMillis > 0) { // Some time has passed
for (Mass m : masses) {
m.updatePosition(deltaMillis);
}
// Do all repaints.
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果动画线程以某种方式延迟导致大量时间坍塌(经典案例在Windows下,单击并保持最小化/最大化防止重新绘制),则会出现问题,这会导致对象以惊人的速度移动.我的问题:有没有办法确定动画线程花费的时间而不是挂钟时间,或者有人可以建议一个解决方法来避免这个问题吗?
到目前为止,我唯一的想法是deltaMillis通过一些上限来构建.
我正在尝试绘制一个笔触为1像素的多边形。因为整个多边形都按100缩放,所以我将线宽设置为0.01。但是由于某种原因,多边形的绘制在屏幕上的线宽看起来是100像素而不是1。
我使用的GeneralPath是多边形形状。如果我使用相同的方法绘制Line2D形状,则会绘制细线。
g2d.scale(100, 100);
g2d.setStroke(new BasicStroke(0.01f));
g2d.draw(theShape);Run Code Online (Sandbox Code Playgroud)
新信息:如果删除setStroke行,我会正确地得到一条2像素的行,因为之前在Graphics2D对象上设置了0.02f的BasicStroke。
这是真正的setStroke行
g.setStroke(new BasicStroke((float) (1f / getRoot().scaleX)));
Run Code Online (Sandbox Code Playgroud) 我打算在android中制作赛车游戏.我已经在不同的移动技术中创建了许多应用程序.但我几乎是游戏应用的初学者.所以我的问题是如何在Android中制作赛道?我应该如何证明汽车正在赛道上移动.我有汽车和赛道的图像.但我不知道我应该如何展示赛道的一部分以及应该如何显示赛车在赛道上?
我想将一个Java Swing组件,例如一个JButton,我也放在JFrame上,渲染到BufferedImage.这通常有效,但有一个主要缺点:文本抗锯齿,尤其是"LCD"抗锯齿模式,在渲染到BufferedImage时不起作用.
我已经将一些示例代码放在一起来演示问题,但首先是我的系统信息:
下面的示例代码将创建一个简单的JFrame,在其上放置一个JButton,然后将JButton呈现为文件"test.png":
public class TextAntiAliasingTest
{
public TextAntiAliasingTest() throws IOException
{
// Create Test-Button which will be rendered to an image
JButton button = new JButton( "The Test-Button" );
button.setSize( 200, 70 );
button.setLocation( 200, 150 );
// Create JFrame
final JFrame frame = new JFrame();
frame.setSize( 800, 600 );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setLayout( null );
frame.setLocationRelativeTo( null );
frame.add( button );
// Show JFrame
SwingUtilities.invokeLater( new Runnable() {
@Override public void …Run Code Online (Sandbox Code Playgroud) 我想创建一个带圆角的自定义边框.
代码 -
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.border.AbstractBorder;
class JRoundedCornerBorder extends AbstractBorder
{
private static final long serialVersionUID = 7644739936531926341L;
private static final int THICKNESS = 5;
JRoundedCornerBorder()
{
super();
}
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
{
Graphics2D g2 = (Graphics2D)g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if(c.hasFocus())
{
g2.setColor(Color.BLUE);
}
else
{
g2.setColor(Color.BLACK);
} …Run Code Online (Sandbox Code Playgroud) 我正在考虑将进度条放入我正在制作的游戏中,从5到20之间的随机数减少到0.这是我的代码到目前为止:
包软件;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;
public class CountDownProgressBar extends JPanel {
RandomValues randomNum;
int timeValue;
Timer timer;
int length, newLength;
public CountDownProgressBar() {
timer = new Timer(24, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = timeValue; i > 0; --i) {
newLength = length - (length / timeValue);
length = newLength;
repaint();
}
}
});
randomNum = new RandomValues();
this.timeValue = 0;
this.setBackground(Color.GRAY);
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我试图在Java中创建一个矩形,但只使用awt包类.
我只能点击两个点,程序必须计算宽度和高度,并在这两个精确的两点之间绘制一个矩形.
以下内容对我不起作用:
package ie.iact.shapes;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
public class Rect extends Shapes {``
private Point secondPoint;
public Rect(Point f, Point s) {
setFirstPoint(f);
setSecondPoint(s);
}
@Override
public void draw(Graphics g) {
int x1 = firstPoint.x;
int y1 = firstPoint.y;
int x2 = secondPoint.x;
int y2 = secondPoint.y;
int a;
int b;
if (x1 < x2) {
a = x1;
} else {
a = x2;
}
if (y1 < y2) { …Run Code Online (Sandbox Code Playgroud) 我正在创建一个简单的程序,在其中绘制一个黑色椭圆形,然后用鼠标单击。但是,我希望出现一个新的椭圆形,而一个旧的椭圆形消失。我将如何去做呢?我弄乱了在mousePressed方法中插入的removeAll()方法,但是它对我不起作用。removeAll()方法是否甚至适用于此?还是我应该使用其他东西?抱歉,答案很明显,但是我对此还很陌生,正在尝试学习。任何建议将不胜感激。谢谢。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PaintPractice extends JPanel implements MouseListener {
Random rand = new Random();
int x = rand.nextInt(450);
int y = rand.nextInt(450);
public PaintPractice(){
super();
addMouseListener(this);
}
public static void main(String[] args){
JFrame frame = new JFrame();
PaintPractice panel = new PaintPractice();
frame.setSize(500, 500);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(panel);
}
public void paint(Graphics g){
g.setColor(Color.BLACK);
g.fillOval(x, y, 50, 50);
}
@Override
public void mousePressed(MouseEvent e) {
x = …Run Code Online (Sandbox Code Playgroud) java-2d ×10
java ×9
swing ×4
android ×1
antialiasing ×1
awt ×1
drawing ×1
graphics ×1
graphics2d ×1
jpanel ×1
progress-bar ×1
repaint ×1
shapes ×1
stroke ×1
timer ×1