java - Java Swing 渲染问题(空白空间和双重渲染)
问题描述
我对 java swing 的 JFrame / JPanel 有一点渲染问题。我想在自己身上渲染一条线,所以我创建了一种方法来使用 Graphics g 渲染许多点,并且它工作得很好(在我的第二台显示器上)。现在我正在使用我的主要笔记本电脑显示器,我得到了诅咒: 渲染问题
它应该只是一条连续的线,但它有这些令人讨厌的小间隙,并且显示了两次......这不会发生在我的另一个(更大)显示器上,但我想那不应该是这样的(它只是与一些显示器一起工作)。所以代码很好(我猜),我的显示器也...... :-你能帮我吗?谢谢大家回答:)
CODE ON PASTEBIN:
https://pastebin.com/kBVSjpCA
https://pastebin.com/svuhSXGw
https://pastebin.com/ftga7v2L
https://pastebin.com/fHtYj35G
https://pastebin.com/zA0N1LqE
解决方案
Oracle 有一个很棒的教程,使用 Swing 创建 GUI。跳过 Netbeans 部分。涵盖自定义绘图的教程部分是执行自定义绘图。
这是我为之前的问题准备的一个 Swing 绘图示例。
总体思路是创建一个JFrame
并创建一个单独的绘图JPanel
。绘图JPanel
将扩展JPanel
并覆盖该paintComponent
方法。
方法的第一行paintComponent
必须是对该方法的调用super
paintComponent
。之后,您可以使用任何您想要的方法Graphics
。Graphics2D
这是完整的可运行代码。
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class DrawingPanelExample implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new DrawingPanelExample());
}
@Override
public void run() {
JFrame frame = new JFrame("My Empty Window");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DrawingPanel panel = new DrawingPanel();
frame.add(panel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public class DrawingPanel extends JPanel {
private static final long serialVersionUID = 1L;
public DrawingPanel() {
this.setPreferredSize(new Dimension(350, 300));
}
@Override
protected void paintComponent(Graphics pen) {
super.paintComponent(pen);
pen.drawRect(50, 50, 20, 20);
pen.drawRect(100, 50, 40, 20);
pen.drawOval(200, 50, 20, 20);
pen.drawOval(250, 50, 40, 20);
pen.drawString("Square", 50, 90);
pen.drawString("Rectangle", 100, 90);
pen.drawString("Circle", 200, 90);
pen.drawString("Oval", 250, 90);
pen.fillRect(50, 100, 20, 20);
pen.fillRect(100, 100, 40, 20);
pen.fillOval(200, 100, 20, 20);
pen.fillOval(250, 100, 40, 20);
pen.drawLine(50, 150, 300, 150);
pen.drawArc(50, 150, 200, 100, 0, 180);
pen.fillArc(100, 175, 200, 75, 90, 45);
}
}
}
推荐阅读
- java - 想要使用具有多个命名空间的 XML 元素的 Java 代码来读取和更新内容
- gmail - “检查来自其他帐户的邮件 > 现在检查邮件”的 API 调用?
- powershell - 查找具有更多进程运行 powershell 的用户
- java - 我如何针对生产者消费者问题优化以下代码
- python - 我不知道如何将此矩阵格式化为文本
- python - Pandas,使用 ~.isin 从列中排除值:类型错误
- javascript - 如何更改在拦截器中传递给 @Render 装饰器的模板名称?
- javascript - 如何类似地从两个键中求和最大值,对象javascript
- html - 绝对定位到父级
- python - 如何在 Mac Big Sur(尝试过 Inkscape Shell)上的 python 或 shell 中将 .PNG 转换为 .SVG?