java - 使用 Graphics 在 JFrame 上显示形状
问题描述
我正在学习如何用 Java 编写图形用户界面。我非常了解一些基础知识,但在这个程序中,我试图在黑色背景的 JFrame 上绘图,但是一旦我运行程序,JFrame 只会在白色背景上显示一条白线。如果有人知道如何解决此问题,我将不胜感激,我一直在尝试自己,但似乎无法弄清楚。
感谢您的关注。我期待着回复。
public class test1 {
public static void main (String[] args)
{
JFrame frame = new JFrame();
frame.setSize(1835,1019);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setResizable(false);
frame.getContentPane().setBackground(Color.BLACK);
JPanel raum = new JPanel()
{
public void paint(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(Color.WHITE);
g2.drawLine(500,500,500,800);
}
};
frame.add(raum);
}
}
解决方案
有许多问题将导致您在未来遇到无穷无尽的问题。
显而易见的一点是,面板的背景颜色非常接近WHITE
,因此很难看到线条。您可以更改面板或线条的背景颜色,它应该可以解决眼前的问题。
您确实需要查看Performing Custom Painting和Painting in AWT and Swing以更好地了解在 Swing 中绘画的工作原理。
一般建议覆盖paintComponent
和避免覆盖paint
。 paint
做了很多工作,除非你愿意接管它的所有工作量,否则你最好避免它。
作为一般规则,您还应该super.paintXxx
在进行任何自定义绘画之前调用该方法。同样,绘画通常是一个复杂的工作流程,最好让父类完成它的工作。
组件还应该向父容器提供尺寸提示,然后父容器可以(通过)更好地决定LayoutManager
所有组件的布局方式。因为不同的平台(甚至具有不同设置的相同平台)可以生成不同大小的窗口装饰,所以最好管理“内容”的大小而不是“窗口”的大小。同样,这将为您节省未来的头痛。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setBackground(Color.BLACK);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(1080, 1920);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setPaint(Color.WHITE);
g2d.drawLine(500, 500, 500, 800);
g2d.dispose();
}
}
}
推荐阅读
- security - SSL 客户端问候重置
- php - PHP - 将拍卖结束日期设置为在工作日结束
- javascript - 在不知道“data-”之后的内容的情况下获取 data-* 属性的值
- android - 清单合并失败:属性 application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory)
- flask-assets - 烧瓶资产 append_path() catch-22
- javascript - TypeError:无法读取未定义 jQuery 的属性“顶部”
- php - PHP 和 Ruby 上的相同代码给出不同的结果
- c# - liskov 替换原则再次 - 每个方法覆盖都违反了原则
- python-3.x - Karatsuba 递归代码无法正常工作
- javascript - 在类标签内反应渲染而不是 id