嗨,我正在努力提高自己的java2D,首先我正在处理绘制多边形.但是,我无法在框架上看到多边形.我阅读了一些教程和示例,但正如我所说,我面临着问题.这是绘制多边形的示例代码;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import javax.swing.JFrame;
public class jRisk extends JFrame {
private JFrame mainMap;
private Polygon poly;
public jRisk(){
initComponents();
}
private void initComponents(){
mainMap = new JFrame();
mainMap.setSize(800, 600);
mainMap.setResizable(false);
mainMap.setVisible(true);
mainMap.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int xPoly[] = {150,250,325,375,450,275,100};
int yPoly[] = {150,100,125,225,250,375,300};
poly = new Polygon(xPoly, yPoly, xPoly.length);
}
protected void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}
/**
* @param args
*/
public static void main(String[] args) {
new jRisk();
}
}
Run Code Online (Sandbox Code Playgroud) 如何在没有类(扩展JFrame)的情况下绘制对象?我找到了getGraphics方法,但它没有绘制对象.
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(600, 400);
JPanel panel = new JPanel();
frame.add(panel);
Graphics g = panel.getGraphics();
g.setColor(Color.BLUE);
g.fillRect(0, 0, 100, 100);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的问题.我正在学习Java,并获得了一个绘制汽车的任务.我在一个扩展的类中完成了这一切,并在其中JPanel进行了绘制paintComponent().
我意识到这是一个糟糕的面向对象编程,并决定尝试子类化一些部分来纠正这种情况.
我试图创建一个绘制轮子的类,但是没有成功.
从本质上讲,我希望能够做到这一点:
Main Class extends JPanel
paintComponent{
Wheel leftWheel = new Wheel(0, 50, 100);
this.add(leftWheel);
}
Run Code Online (Sandbox Code Playgroud)
这应该在该点内的点(0,50)处绘制一个轮子JPanel,并且直径为100.
但是,我不确定我应该如何控制中的位置JPanel.当我这样做时,在我窗口的顶部中心绘制轮子.这是我的轮类看起来像:
public class Wheel extends JComponent {
private int x, y, diameter;
private boolean clockwise;
Wheel(int x, int y, int size, boolean cw)
{
this.setPreferredSize(new Dimension(size, size));
this.x = x;
this.y = y;
diameter = size;
clockwise = cw;
repaint();
}
public void paintComponent(Graphics canvas)
{
super.paintComponent(canvas);
canvas.setColor(Color.gray);
canvas.fillOval(x,y,diameter,diameter);
}
}
Run Code Online (Sandbox Code Playgroud)
x和y应该是它在父窗口中出现的位置,但是,在以下代码中不是这种情况(位于扩展JFrame的父类中):
Wheel …Run Code Online (Sandbox Code Playgroud) 我有JPanel一个paintComponent()功能.我会调用一次,然后当用户点击不同的时候JButton,我会设置一些标志并想再次调用这个函数,因为它会在设置标志后做一些稍微不同的事情.
所以这就是我想知道的:我如何清除现有的东西paintComponent?要重新绘制,我只是paintComponent再打电话吗?
目前我正在尝试以下方法:
flag2 = true;
repaint(); //I expect (want) paintComponent to be called again
Run Code Online (Sandbox Code Playgroud)
在paint组件中,我做的事情如下:
if (flag2==true) {
g.drawRect(...);
} else {
g.drawLine(...);
}
Run Code Online (Sandbox Code Playgroud)
但通过测试,似乎我正在做的事情有问题.
谢谢你的帮助.
我目前正在开发一个自助服务终端风格的Java程序来显示天气,时间,预测等.这是一个程序应该是什么样子的镜头(在更新时间之前拍摄的截图)

各个部分创建为JPanels,并paintComponent()重写了方法.它们绘制渐变标题和半透明背景.但是,当我更改其中一个面板的内容时,之前的内容会被遗忘,而不是被删除.一个例子如下所示:
如你所见,当时间从11:51变为11:52时,数字重叠,背景变得更亮(因为半透明背景被重新绘制)

我该怎么做才能防止这种重叠?最终,当单个面板更新其内容时,我宁愿不必重绘整个屏幕.我宁愿只重绘那个特定的部分.重新绘制背景,然后是其中的所有组件将很容易.
几个答案涉及清除要绘制的区域.我是否使用g.clear()或AlphaComposite.CLEAR删除背景图像.这可以在下图中看到.也许如果我可以在清除区域之前复制背景,我可以重新绘制背景的那一部分,然后适当地分层其他图像.思考?

提交了一个答案,其中显示了在透明面板和背景上放置的计时器的完整工作示例.这非常有用,但是,我不是手动绘制我的子组件.时间,天气图标和温度都是JLabel布局在半透明面板上.我宁愿不必手动绘制单个组件.
我正在尝试构建一个简单的绘图工具.该mouseDrag事件创建一个新的椭圆形,并导致我JPanel到repaint().
这到目前为止工作正常.但是,如果我mouseDrag在第一次触发事件之前按下任何按钮(或任何其他UI组件),则按钮将绘制在我面板的左上角.
我已将代码隔离到此测试应用程序中:
import java.awt.BasicStroke;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test extends JFrame
{
public Test()
{
final JPanel paintPanel = new JPanel(){
@Override
protected void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D)g;
g2d.setPaintMode();
g2d.setStroke(new BasicStroke(1));
g2d.fillRect(100, 100, 10, 10);
}
};
paintPanel.setPreferredSize(new Dimension(300,300));
paintPanel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e)
{
paintPanel.repaint();
}
});
this.setLayout(new …Run Code Online (Sandbox Code Playgroud) 在学习了dispose()应该在使用后调用Graphics/ Graphics2Dobject之后,我开始改变我的游戏以包含它.
当我添加g2d.dispose()了被覆盖paintComponent(Graphics g)的JPanel,我添加的组件(JLabel类的扩展)未呈现的时候我仍然可以点击它们等但它们不会被绘制.
我测试了正常JLabel和JButton相同的效果(虽然JButton鼠标在它上面时渲染).
所以我的问题是为什么会发生这种情况?
这是一个SSCCE来证明:

在取消呼叫后dispose()在paintComponent的MainMenuPanel类:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import …Run Code Online (Sandbox Code Playgroud) 我实现了不同类型的排序(气泡,插入,选择).知道我想比较他们的实现,如下面的每种排序(这里是冒泡排序的例子):

例如,这是我的冒泡排序:
private static int[] bubbleSort(int[] tabToSort) {
int [] tab = tabToSort.clone();
boolean tabSort = false;
while(!tabSort){
tabSort = true;
for(int i = 0; i < tab.length -1; i++){
if(tab[i]> tab[i+1]){
int temp = tab[i+1];
tab[i+1] = tab[i];
tab[i] = temp;
tabSort = false;
}
}
}
return tab;
}
Run Code Online (Sandbox Code Playgroud)
我启动了GUI,并在其上放置了1000个随机点和行y=x:
@Override
public void paintComponent (Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.BLACK);
Dimension size = getSize();
Insets insets= getInsets();
int w = size.width - insets.left …Run Code Online (Sandbox Code Playgroud) 我正在使用paintComponent()在背景上绘制一个gif动画图像JPanel.它显示了gif但没有动画.我使用java 1.5,我知道我可以使用带有图标的标签.
有没有人知道为什么以及如何解决它?
private static class CirclePanel extends JPanel {
ImageIcon imageIcon = new ImageIcon(BarcodeModel.class.getResource("verify.gif"));
Point point = f.getLocation();
protected void paintComponent(Graphics g) {
Graphics gc = g.create();
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
g2d.setColor(Color.BLUE);
g2d.drawImage(imageIcon.getImage(), getWidth() / 2, getHeight() / 2, null);
g2d.drawRect(0, 0, getWidth(), getHeight());
g2d.setStroke(new BasicStroke(10f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER));
g2d.setFont(g.getFont().deriveFont(Font.BOLD | Font.ITALIC,15f));
g2d.drawString("Wait Please ...",getWidth()/2-imageIcon.getIconHeight()/3,getHeight()/2+imageIcon.getIconHeight()+15);
g2d.dispose();
}
Run Code Online (Sandbox Code Playgroud)
这是gif图像.

编辑:只需将图像观察者添加到g2d.drawImage()方法.
g2d.drawImage(imageIcon.getImage(), getWidth() / 2, getHeight() / 2, this);
Run Code Online (Sandbox Code Playgroud) 这是绘制椭圆形的简单示例.
public class SwingPainter extends JFrame{
public SwingPainter() {
super("Swing Painter");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
getContentPane().add(new MySwingComponent());
setSize(200, 200);
setVisible(true);
}
public static void main(String[] args) {
new SwingPainter();
}
class MySwingComponent extends JComponent {
public void paintComponent(Graphics g) {
System.out.println("paintComponent");
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(10, 10, 50, 50);
}
@Override
protected void paintBorder(Graphics g) {
System.out.println("Paint border");
super.paintBorder(g);
}
@Override
protected void paintChildren(Graphics g) {
System.out.println("Paint children");
super.paintChildren(g);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是在调试模式或在绘制之前向控制台添加一些信息(如示例中),您可以看到swing绘制组件两次.
的paintComponent
油漆边框
画儿童
的paintComponent
油漆边框
画儿童
我无法理解它为什么会发生,但我认为它会影响困难的GUI中的性能.
java ×10
paintcomponent ×10
swing ×10
jpanel ×4
graphics ×3
graphics2d ×2
repaint ×2
animated-gif ×1
awt ×1
java-2d ×1
jcomponent ×1
polygon ×1
sorting ×1
transparency ×1