标签: paintcomponent

新创建的图形对象仅在调整帧大小后显示

这是这篇文章的延续

我有一组随机大小的图形添加和绘制到JPanel组件.我有一个按钮,它将一个新的绘图对象添加到同一个JPanel但直到我重新调整窗口大小才显示.我已经加入中提到的EDT信息这个职位,并也被称为组件上重绘()方法.我还没有使用ArrayList,正如Hovercraft所建议的那样,但我会的.我的大脑需要慢慢理解事情.

谢谢.

代码分为两类.

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ZombieDance extends JComponent {

JFrame canvas = new JFrame();
JPanel actionPanel = new JPanel();
JButton newZombie = new JButton("Add new Zombie");

ZombieDance(){
//create a couple default zombies
    buildGUI();
    Random rand = new Random();
    int i,x,y,w,h;

    //add zombies to my canvas
    for (i=1;i<8;i++) {
        float r = rand.nextFloat();
        float g = …
Run Code Online (Sandbox Code Playgroud)

java swing paintcomponent

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

如何在另一张图像上绘制图像?

我有一个关于随机城市交通网络模拟的Java项目,我已经设法找到了实现这个项目的方法,所以我将每个交叉点划分为一个基本上是扩展JPanel类(名为Carrefour)的部分.一切都运转良好,直到我遇到如何画车并让它们通过道路.

所以我的问题是如何在另一幅图像(道路)上绘制图像(车辆图像)?

java swing bufferedimage drawimage paintcomponent

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

Java如何在布局中添加图像作为背景

我有一个使用CardLayout的类,它有两张卡片,上面有一个按钮.我希望能够做的是放置一个像背景一样的图像,例如Windows中的桌面背景.该程序最终将有几张不同的卡片,我希望能够在每张卡片上放置不同的背景.我已尝试过在本网站上提出的其他类似问题中提出的许多建议,以及通过Google搜索我能找到的任何建议,但我似乎无法让它发挥作用.我知道使用CardLayout我不能将面板放在面板上,因此将图像放在JPanel上是行不通的.所以我的问题是,根据下面发布的代码,我有更好的方法来设置我的布局,以便它更好地工作,而且,我应该如何处理显示图像,使其在按钮的背景中?任何帮助将不胜感激.

import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Cards implements ActionListener {    
private JPanel cards;
private JButton button1;
private JButton button2;
private Image backgroundImage;

public void addComponentToPane(Container pane) throws IOException {
    backgroundImage = ImageIO.read(new File("background.jpg"));

    //create cards
    JPanel card1 = new JPanel()
    {
        @Override
        public void paintComponent(Graphics g)
        {
            g.drawImage(backgroundImage, 0, 0, null);
        }
    };
    JPanel card2 = new JPanel();
    button1 = new JButton("Button 1");
    button2 = new JButton("Button 2");
    button1.addActionListener(this);
    button2.addActionListener(this);        
    card1.add(button1); …
Run Code Online (Sandbox Code Playgroud)

java swing jpanel paintcomponent cardlayout

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

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
查看次数

重新绘制JScrollPane中的JPanel

我正在开发的项目是用于玩桌面游戏的计算机间实用程序,其中一个关键部分是交互式网格/地图.我已经内置了自定义地图创建功能,并希望屏幕能够显示非常大的地图,以及非常小的地图.为此,我创建了一系列类,我可以使用它来显示任何大小的网格.然而,我想要做的是将完成的JPanel放入JScrollPane,从而为地图创造无限空间.当我尝试这样做时,完全显示出JScrollPane的地图根本不会绘制.我怀疑它与Graphics上下文有关,但到目前为止还无法找到解决方案.

在下面的代码中,注释滚动行并在初始化中切换grid.draw方法调用,以查看我希望它看起来像什么.

完整代码如下:

package pac;

import javax.swing.*;
import javax.swing.text.*;

import java.awt.*;

public class MainScreen extends JFrame
{
int width, height, x, y;
Grid grid;

public static void main(String[] args) 
{
    MainScreen mainScreen = new MainScreen();
    mainScreen.setVisible(true);        
}

public MainScreen()
{
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    float factor = 1.25f;
    width = (int)(dim.width / factor);
    height = (int)(dim.height / factor);
    x = (int)(dim.width / (factor * 8));
    y = (int)(dim.height / (factor * 8));

    setBounds(x,y,width,height);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setTitle("DnD Main Screen");
    setVisible(true);
    grid = …
Run Code Online (Sandbox Code Playgroud)

java swing jpanel jscrollpane paintcomponent

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

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
查看次数

需要帮助理解挥杆代码

我开发了一个带有椭圆形和按钮的swing应用程序,其输出如下所示,代码如下: -

在此输入图像描述

码:-

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;


public class AlphaCompositeDemo extends JFrame{
AlphaCompositeDemo()
{
super("AlphaComposite Demo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400,400);
setLayout(new FlowLayout());

setBackground(new Color(0.2f,0.7f,0.1f,0.4f));
comp c=new comp();

add(c);
add(new JButton("Click"));
setVisible(true);
}
public static void main(String args[])
{
JFrame.setDefaultLookAndFeelDecorated(true);
SwingUtilities.invokeLater(new Runnable(){public void run(){new AlphaCompositeDemo();}});
}
}

class comp extends JComponent
{
public void paintComponent(Graphics g)
{
    Graphics2D g2=(Graphics2D)g.create();
    g2.setComposite(AlphaComposite.SrcOver);
    g2.setColor(Color.RED);
    g2.fillOval(50, 50, 220, 120);
}
public …
Run Code Online (Sandbox Code Playgroud)

java swing graphics2d paintcomponent translucency

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

为什么整个JPanel没有重新粉刷?

为什么在Java中当我尝试将窗口从屏幕一侧移动到中心时,那么整个JPanel不会重新绘制它自己?

示例:当我尝试将窗口从屏幕一侧(因此只有大约一半窗口可见)拖到中心时发生这种情况:

疯马

如果我添加一个组件监听器,然后放入repaint()componentMoved方法,它将正常工作,但每次移动窗口时它将重新绘制.

相关代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TEST extends JFrame
{

    public TEST()
    {
        super ("TEST!");
        setSize (500,400);
        setLocationRelativeTo(null);
        setContentPane(new MyPanel());
        addComponentListener(this);
    }

    class MyPanel extends JPanel
    {   
        public void paintComponent (Graphics g)
        {

            super.paintComponent(g);

            Graphics g2d =  (Graphics2D) g;

            int R = (int)(Math.random()*256);
            int G = (int)(Math.random()*256);
            int B= (int)(Math.random()*256);
            Color color = new Color(R, G, B);

            g2d.setColor(color);
            g2d.fillOval(0, 0, …
Run Code Online (Sandbox Code Playgroud)

java graphics swing jpanel paintcomponent

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