标签: paintcomponent

奇怪的图形错误:组件A的副本涂在组件B上.帮助!(Java)的

我做了一个简单的绘画程序,你可以使用画笔工具绘制一些不同的颜色并擦除(只需涂上白色).

它工作正常,但我有一个非常奇怪的图形错误,导致工具面板和最后一个鼠标悬停的颜色/工具图标绘在绘图面板的顶部.

实现:该框架包含两个JPanel扩展:ToolPanel和DrawPanel.ToolPanel拥有两个JPanel,它们包含颜色和工具按钮.按钮是JComponent的扩展.

链接到屏幕截图(我不允许发布图像):

在此输入图像描述

注意:第二个"假"工具面板中的按钮不是可以点击的实际按钮,我可以在它上面绘画.如果我在左角的"假"颜色按钮上绘画,当我鼠标悬停一个新颜色并用鼠标进入绘图面板时,它将再次重新绘制.

注意2:我曾经有一个JMenuBar,它也被绘在了drawpanel上.每次在窗口(不仅仅是面板)失去焦点一次后,拉伸面板被重新绘制.

一些代码:(我知道工具选择实现不是最好的:P)

DrawPanel的paintComponent方法:

    public void paintComponent(Graphics g) { 
    if(isMousePressed) {
        if(tool == "BRUSH") {
            g.setColor(color);
            g.fillOval(currentEvent.getX(), currentEvent.getY(), 30, 30);
        } else if(tool == "ERASER") {
            g.setColor(getBackground());
            g.fillOval(currentEvent.getX(), currentEvent.getY(), 30, 30);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我遗漏了任何相关信息或代码,请告诉我.

假设:我没有在DrawPanels paintComponent-method中调用super.paintComponent,这可能会导致一些问题?我不这样做的原因是,如果我这样做,它将一直重新绘制背景,因此只有我最后绘制的点才会可见.不确定超级调用是否实际解决了问题,或者假面板是否也被背景覆盖.也许我需要以其他方式解决这个问题?或者是别的什么?

谢谢!

java graphics swing paintcomponent

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

Java中的repaint()不会立即"重新绘制"?

我有这样的代码:

// In MyPanel.java
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    // Draw something
    mypanel_count++;
}

// In Test.java
public void testLargeData()
{
    while (notDone)
    {
        panel.repaint();
        // do huge work
        test_count++;
        System.out.println("Test_count: " + test_count + ", MyPanel_count: " + mypanel_count);
    }
}

// Output !!!
Test_count: 752, MyPanel_count: 23
Test_count: 753, MyPanel_count: 23
Test_count: 754, MyPanel_count: 23
Test_count: 755, MyPanel_count: 24
Run Code Online (Sandbox Code Playgroud)

但是当我改变panel.repaint()panel.paintComponent(panel.getGraphics()),出局是正确的:

Test_count: 752, MyPanel_count: 752
Test_count: 753, MyPanel_count: 753
Test_count: 754, MyPanel_count: 754
Test_count: …
Run Code Online (Sandbox Code Playgroud)

java swing repaint paintcomponent

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

线程"AWT-EventQueue-0"中的Java异常java.lang.NullPointerException

好吧我想在这里做的是创建一个游戏,通过用鼠标点击对象来控制对象/球,拉回鼠标(鼠标被拉回的距离将决定对象的速度)和释放按钮,物体将移动(它的移动角度也将取决于鼠标被拉回的角度)

现在我可以告诉'数学'至少应该只是工作,不幸的是我无法测试,因为我得到以下错误.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Snail.moveUp(Snail.java:35)
at Snail.chill(Snail.java:20)
at Level.mouseReleased(Level.java:120)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at …
Run Code Online (Sandbox Code Playgroud)

java swing nullpointerexception jpanel paintcomponent

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

如何旋转图形对象而不更改其位置?

我得到以下代码:

import java.awt.*;
import javax.swing.*;

public class GraphicPanel extends JPanel {

    public void paintComponent(Graphics g){

        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.setFont(new Font("Arial",Font.BOLD,24));
        g2d.drawString("A",300,250);
        g2d.rotate(45 * Math.PI/180);
        g2d.drawString("B",300,250);

    }

}
Run Code Online (Sandbox Code Playgroud)

它应该旋转B并将其放在A所在的相同位置,但是由于某种原因,B会在完全不同的位置出现。

我很确定我理解为什么。这是因为缩放,旋转等操作时会操纵整个协调系统(我正确吗?)

无论如何,我想知道如何旋转或缩放对象,并且仍然使它出现在以前的位置。例如,在一个游戏中,每10毫秒不断更新和显示一次自身,其中一个精灵正在旋转,但是仍然停留在10毫秒之前的位置。

编辑:试图事先搜索Google,猜想这个问题的措辞有点棘手,因为我发现没有帮助。

非常感谢 :)

java swing rotation graphics2d paintcomponent

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

Java JPanel getGraphics()

由于Java只支持single inheritance,我希望paint直接在一个JPanel类的成员的实例上Panel.我抓住了Graphics会员的一个实例,然后把我想要的任何东西都涂在上面.

如果不重写,我怎么能不继承JComponentJPanel仍然利用getGraphics()绘画?thispublic void paintComponent(Graphics g)

private class Panel
{
      private JPanel panel;
      private Grahics g;

      public Panel()
      {
           panel = new JPanel();
      }

      public void draw()
      {
           g = panel.getGraphics();
           g.setColor(Color.CYAN);
           g.draw(Some Component);
           panel.repaint();
      }
}
Run Code Online (Sandbox Code Playgroud)

面板被添加到JFrame在调用之前可见的面板中panel.draw().这种方法对我不起作用,虽然我已经知道如何通过继承JPanel和覆盖来绘制自定义组件,但我public void paintComponent(Graphics g)不想继承JPanel.

java graphics swing jpanel paintcomponent

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

将.gif图像添加到JTabbed窗格时,它不会移动

我有一个JFrame.在那我有两个容器,即两个JPanel.一个小组持有一张图片.另一个持有JButton.然后将这两个添加到JTabbedPane.

我的问题是使用.gif图像,图像变得像任何其他正常的.jpg图像一样静止.谁能帮助我一些更多的想法?

这是我的代码:

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.UIManager.LookAndFeelInfo;

public class ICLOUD implements ActionListener {

private BufferedImage bg;
JButton b1;
private Object frame1;
JFrame frame2 = new JFrame();

  JDesktopPane desktop …
Run Code Online (Sandbox Code Playgroud)

java swing image animated-gif paintcomponent

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

Swing覆盖对象的paintComponent

如果我有一个JPanel我无法修改的对象,有没有办法可以在paintComponent不使用注入的情况下修改它的方法?

一种方法我想的是获取JPanelGraphics对象,将它传递给paintComponent(),这个执行操作Graphics的对象,终于画,在我的自定义JPanel.这样做的问题,是我需要能够这样原来的每一次做JPanelpaintComponent()叫.

我不需要替换paintComponent()中的内容,我只需要添加它.

例如:

JFrame frame = null;
for (Frame f : JFrame.getFrames()) {
  if (((JFrame) f).getTitle().equals("Title")) {
    JPanel panel = null;
    // ... Cycle through all components and get the one that's a JPanel

    // I want to use ColorConvertOp to make panel greyscale
  }
}
Run Code Online (Sandbox Code Playgroud)

java swing paintcomponent

4
推荐指数
2
解决办法
2537
查看次数

Java中的Graphics类如何工作?

最近,我一直在尝试用图形做一些Java工作.现在Graphics类是抽象的,这意味着它本身不能被实例化,但它的子类可能能够被实例化.那么下面的代码中发生了什么.(这确实成功创建了一条线)

import javax.swing.*;
import java.awt.*;

public class line extends JPanel {
    public void paintComponent(Graphics g) {
        g.drawLine(0, 0, 90, 90);
    }

    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.add(new line());
        jf.setSize(500, 500);
        jf.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,现在有一些事情对我没有意义.首先,当调用line时,它必须在line类中执行paintComponent方法.这是静态方法的属性(使用类名称调用).但paintComponent方法没有静态修饰符.

由于这个程序有效,我们必须假设paintComponent被调用并且期望Graphics对象作为参数.虽然它没有参数被调用.为什么这不会产生错误?我运行了一些测试,传入一个字符串,然后没有任何东西进入一个期望一个Integer对象的方法.我在这两个程序上都有错误.

因此,某种方式创建了一个名为g的图形对象,并使用了drawline方法.但图形是抽象的.

好的,这是我的问题:

  1. 当paintComponent不是静态时,为什么在调用类行时会自动调用paintComponent?

  2. 为什么paintComponent在需要Graphics对象时会接受空参数?

  3. 然后如何制作Graphics对象,因为Graphics类是抽象的并且无法实例化?

帮我Stack Overflow,你是我唯一的希望.

编辑:好的,我认为这个问题得到了很好的回答,谢谢!

java graphics swing paintcomponent

4
推荐指数
1
解决办法
5885
查看次数

JPanel设计问题

我有一个表格,我在mouseClick事件上画椭圆形.这对我来说很好.圈子被画了.但是当我最小化窗体并再次最大化它时,面板将被刷新并且圆圈被移除(即面板被留空).

代码是:我有一个JFrame,其上有一个名为jPanel1的Jpanel,在此面板上绘制圆圈.

private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) {
        count += 1;
        if (count <= clients) {
            drawCircle(evt.getX() - (radius / 2), evt.getY() - (radius / 2));
        }
    }

    public void drawCircle(int x, int y) {
        Graphics g = jPanel1.getGraphics();
        g.drawOval(x - radius, y - radius, 2 * radius, 2 * radius);
        g.setColor(Color.BLACK);
        g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
    }
Run Code Online (Sandbox Code Playgroud)

java graphics swing jpanel paintcomponent

4
推荐指数
1
解决办法
254
查看次数

JPanel无法正确绘制

我是Java和Swing的新手,这也是我的第一篇文章,如果它没有多大意义,那就很抱歉.

我想要做的是当我点击JPanel时,我希望它在我点击的位置添加一个圆圈.目前,所有似乎都发生的事情就是当我点击时,我要添加的JPanel中会出现一个小的灰色方块,但我似乎找不到任何方法让它像圆圈一样绘制.

我有一个扩展JPanel的类叫做"Ball",这是我点击时添加的内容.目前,我并不担心它在正确的位置,只是为了正确地抽球.以下是我的"Ball"类的代码:

package paintsliders;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

class Ball extends JPanel{

private int x,y,w,h;

//I will use this constructor to put the ball in the correct location later.
Ball(){
    /*this.w = 100;
    this.h = 100;
    this.x = 200;
    this.y = 200;*/
}

//draw the ball
    @Override
public void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.drawOval(200,200,10,10);
      g.setColor(Color.RED);
    }

}
Run Code Online (Sandbox Code Playgroud)

我可以猜测它与paintComponent方法有关,但我看到的任何地方似乎都没有解决方案.

任何帮助都会很棒,谢谢!

java geometry swing jpanel paintcomponent

4
推荐指数
1
解决办法
1483
查看次数