标签: paintcomponent

关于在java中绘制Polygon

嗨,我正在努力提高自己的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)

java swing polygon java-2d paintcomponent

9
推荐指数
1
解决办法
7万
查看次数

使用getGraphics()绘制对象而不扩展JFrame

如何在没有类(扩展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 swing graphics2d paintcomponent

9
推荐指数
1
解决办法
5万
查看次数

画一个车轮

我有一个非常简单的问题.我正在学习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)

java swing jcomponent jpanel paintcomponent

9
推荐指数
2
解决办法
1276
查看次数

JPanel Graphics清除和重新绘制?

我有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 graphics swing jpanel paintcomponent

8
推荐指数
2
解决办法
5万
查看次数

Java透明度渲染错误

我目前正在开发一个自助服务终端风格的Java程序来显示天气,时间,预测等.这是一个程序应该是什么样子的镜头(在更新时间之前拍摄的截图)

图像显示图形错误之前所需的输出

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

如你所见,当时间从11:51变为11:52时,数字重叠,背景变得更亮(因为半透明背景被重新绘制)

图形错误

显示图形错误的图像

我该怎么做才能防止这种重叠?最终,当单个面板更新其内容时,我宁愿不必重绘整个屏幕.我宁愿只重绘那个特定的部分.重新绘制背景,然后是其中的所有组件将很容易.

更新

几个答案涉及清除要绘制的区域.我是否使用g.clear()AlphaComposite.CLEAR删除背景图像.这可以在下图中看到.也许如果我可以在清除区域之前复制背景,我可以重新绘制背景的那一部分,然后适当地分层其他图像.思考?

在此输入图像描述

更新2

提交了一个答案,其中显示了在透明面板和背景上放置的计时器的完整工作示例.这非常有用,但是,我不是手动绘制我的子组件.时间,天气图标和温度都是JLabel布局在半透明面板上.我宁愿不必手动绘制单个组件.

java swing transparency repaint paintcomponent

8
推荐指数
1
解决办法
3305
查看次数

paintComponent在绘图之上绘制其他组件

我正在尝试构建一个简单的绘图工具.该mouseDrag事件创建一个新的椭圆形,并导致我JPanelrepaint().

这到目前为止工作正常.但是,如果我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)

java swing repaint graphics2d paintcomponent

8
推荐指数
2
解决办法
4634
查看次数

为什么在Graphics对象上调用dispose()会导致JPanel不呈现任何组件

在学习了dispose()应该在使用后调用Graphics/ Graphics2Dobject之后,我开始改变我的游戏以包含它.

当我添加g2d.dispose()了被覆盖paintComponent(Graphics g)JPanel,我添加的组件(JLabel类的扩展)未呈现的时候我仍然可以点击它们等但它们不会被绘制.

我测试了正常JLabelJButton相同的效果(虽然JButton鼠标在它上面时渲染).

所以我的问题是为什么会发生这种情况?

这是一个SSCCE来证明:

在此输入图像描述

在取消呼叫后dispose()paintComponentMainMenuPanel类:

在此输入图像描述

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)

java graphics swing jpanel paintcomponent

8
推荐指数
1
解决办法
1万
查看次数

比较排序算法

我实现了不同类型的排序(气泡,插入,选择).知道我想比较他们的实现,如下面的每种排序(这里是冒泡排序的例子):

在此输入图像描述

例如,这是我的冒泡排序:

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)

java sorting user-interface swing paintcomponent

8
推荐指数
1
解决办法
906
查看次数

为什么gif动画在paintComponent()中使用它时没有动画?

我正在使用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)

java swing animated-gif jpanel paintcomponent

7
推荐指数
1
解决办法
7882
查看次数

为什么swing会简单地绘制两次?

这是绘制椭圆形的简单示例.

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 graphics swing awt paintcomponent

7
推荐指数
1
解决办法
1238
查看次数