我做了一个简单的绘画程序,你可以使用画笔工具绘制一些不同的颜色并擦除(只需涂上白色).
它工作正常,但我有一个非常奇怪的图形错误,导致工具面板和最后一个鼠标悬停的颜色/工具图标绘在绘图面板的顶部.
实现:该框架包含两个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,这可能会导致一些问题?我不这样做的原因是,如果我这样做,它将一直重新绘制背景,因此只有我最后绘制的点才会可见.不确定超级调用是否实际解决了问题,或者假面板是否也被背景覆盖.也许我需要以其他方式解决这个问题?或者是别的什么?
谢谢!
我有这样的代码:
// 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()),出局是正确的:
Run Code Online (Sandbox Code Playgroud)Test_count: 752, MyPanel_count: 752 Test_count: 753, MyPanel_count: 753 Test_count: 754, MyPanel_count: 754 Test_count: …
好吧我想在这里做的是创建一个游戏,通过用鼠标点击对象来控制对象/球,拉回鼠标(鼠标被拉回的距离将决定对象的速度)和释放按钮,物体将移动(它的移动角度也将取决于鼠标被拉回的角度)
现在我可以告诉'数学'至少应该只是工作,不幸的是我无法测试,因为我得到以下错误.
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) 我得到以下代码:
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只支持single inheritance,我希望paint直接在一个JPanel类的成员的实例上Panel.我抓住了Graphics会员的一个实例,然后把我想要的任何东西都涂在上面.
如果不重写,我怎么能不继承JComponent或JPanel仍然利用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.
我有一个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) 如果我有一个JPanel我无法修改的对象,有没有办法可以在paintComponent不使用注入的情况下修改它的方法?
一种方法我想的是获取JPanel的Graphics对象,将它传递给paintComponent(),这个执行操作Graphics的对象,终于画,在我的自定义JPanel.这样做的问题,是我需要能够这样原来的每一次做JPanel的paintComponent()叫.
我不需要替换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工作.现在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方法.但图形是抽象的.
好的,这是我的问题:
当paintComponent不是静态时,为什么在调用类行时会自动调用paintComponent?
为什么paintComponent在需要Graphics对象时会接受空参数?
然后如何制作Graphics对象,因为Graphics类是抽象的并且无法实例化?
帮我Stack Overflow,你是我唯一的希望.
编辑:好的,我认为这个问题得到了很好的回答,谢谢!
我有一个表格,我在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和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 ×10
paintcomponent ×10
swing ×10
graphics ×4
jpanel ×4
animated-gif ×1
geometry ×1
graphics2d ×1
image ×1
repaint ×1
rotation ×1