这是这篇文章的延续
我有一组随机大小的图形添加和绘制到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项目,我已经设法找到了实现这个项目的方法,所以我将每个交叉点划分为一个基本上是扩展JPanel类(名为Carrefour)的部分.一切都运转良好,直到我遇到如何画车并让它们通过道路.
所以我的问题是如何在另一幅图像(道路)上绘制图像(车辆图像)?
我有一个使用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) 如果我有一个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,你是我唯一的希望.
编辑:好的,我认为这个问题得到了很好的回答,谢谢!
我正在开发的项目是用于玩桌面游戏的计算机间实用程序,其中一个关键部分是交互式网格/地图.我已经内置了自定义地图创建功能,并希望屏幕能够显示非常大的地图,以及非常小的地图.为此,我创建了一系列类,我可以使用它来显示任何大小的网格.然而,我想要做的是将完成的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) 我有一个表格,我在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方法有关,但我看到的任何地方似乎都没有解决方案.
任何帮助都会很棒,谢谢!
我开发了一个带有椭圆形和按钮的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中当我尝试将窗口从屏幕一侧移动到中心时,那么整个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 ×10
paintcomponent ×10
swing ×10
jpanel ×5
graphics ×3
cardlayout ×1
drawimage ×1
geometry ×1
graphics2d ×1
jscrollpane ×1
translucency ×1