java用frame画面板_为什么paintComponent没有在面板上绘制? - java

我在将代码绘制到jpanel时遇到了一些麻烦。

除图形外,其他所有内容均正常运行。

还有其他答案,我需要使用setSize设置面板的大小,但是我已经做到了。

其他答案说我需要调用super.paintComponent(g);,但是我也这样做。

我想念什么?

这是我的代码:

在此先感谢您的帮助。

import javax.swing.*;

import java.awt.*;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import static java.awt.Color.*;

public class Main extends JPanel implements KeyListener {

//Declare all class vars.

private Snake snake = new Snake(50,50,50);

//Declare all Player global booleans

private boolean leftPressed, rightPressed, upPressed, downPressed;

//Declare all Gamestate gobal booleans

// private boolean running = true;

public static void main(String[] args){

Main main = new Main();

main.createFrame();

SwingUtilities.invokeLater(main::customUpdate);

}

private void createFrame() {

JFrame frame = new JFrame("Snaek");

JPanel panel = new JPanel();

frame.setResizable(false);

frame.setSize(800,800);

frame.setLocationRelativeTo(null);

frame.add(panel);

frame.setVisible(true);

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

panel.requestFocus();

panel.addKeyListener(this);

panel.setSize(new Dimension(frame.getWidth(), frame.getHeight()));

Frame.getFrames();

}

private void customUpdate() {

if(leftPressed) {

snake.changeX(-1);

} else if(upPressed) {

snake.changeY(-1);

} else if(downPressed) {

snake.changeY(1);

} else if(rightPressed) {

snake.changeX(1);

}

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

g.setColor(black);

g.drawRect(snake.getX(), snake.getY(), snake.getSize(), snake.getSize());

g.drawRect(100,100,200,200);

repaint();

}

@Override

public void keyTyped(KeyEvent e) {

}

@Override

public void keyPressed(KeyEvent e) {

switch (e.getKeyCode()) {

case 37:

// System.out.println("Left?");

leftPressed = true;

break;

case 38:

// System.out.println("Up?");

upPressed = true;

break;

case 39:

// System.out.println("Right?");

rightPressed = true;

break;

case 40:

System.out.println("Down?");

downPressed = true;

break;

case 27: //Escape

System.out.println(snake.getX());

break;

case 50: //Space

// spacePressed = true;

break;

}

}

@Override

public void keyReleased(KeyEvent e) {

System.out.println(e.getKeyCode());

switch (e.getKeyCode()) {

case 37:

// System.out.println("Left?");

leftPressed = false;

break;

case 38:

// System.out.println("Up?");

upPressed = false;

break;

case 39:

// System.out.println("Right?");

rightPressed = false;

break;

case 40:

// System.out.println("Down?");

downPressed = false;

break;

}

}

}

参考方案

您将在此处创建新的JPanel:

JPanel panel = new JPanel();

然后将其添加到JFrame

frame.add(panel);

相反,您应该在其中添加面板(Main)

frame.add(this);

另外,如@VinceEmigh在上面的注释中所述,请避免在repaint()方法中调用paintComponent(),否则您可能陷入无休止的循环,滞后或冻结应用程序。绘画方法仅用于绘画。

另一个技巧是使用KeyBindings而不是KeyListener,否则您可能会陷入程序无法响应按键事件的情况...

而且我还将frame.setVisible(true);行移到createFrame()方法的末尾...

Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。Java swing-事件触发后,我可以在选项卡上更改名称吗? - java

一,代码:tab_textArea_file.addTab(docLabel, null, scrollPane_textArea, null); 因此,情况是我有一个可供用户选择的文件列表。用户单击文件时,将读取文件的内容并将其加载到textArea中。 “ docLabel”(在上面的代码中)是应该更改为所选文件名的字符串,但并非如此。是否可以通过上面的…Swing-典型桌面应用程序中的并发 - java

这可能是一个广泛的问题,但我想知道单用户桌面应用程序通常在何处使用并发。您如何发现理想情况下(在设计阶段)并发问题?附注:从操作系统理论上来说,并发问题通常发生在无法共享资源(例如打印机)的情况下。不过,我仍然对在编程级别上可能发生的情况感到迷惑。 java大神给出的解决方案 Event Dispatch thread与其他逻辑之间的Swing中可能存在线程…Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将带有自定义图案的Swing按钮组件在图片上,可以使用Java的Graphics2D类。首先,需要创建一个继承自JPanel的自定义面板,并在该面板上添加自定义图案的按钮组件。然后,使用Graphics2D类的drawImage()方法将面板绘制到所需的图片上。 下面是一个简单的示例代码,展示如何将带有自定义图案的按钮面板绘制到图片上: ```java import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class ButtonOnImageDemo extends JPanel { private static final long serialVersionUID = 1L; public ButtonOnImageDemo() { // 创建自定义按钮 JButton customButton = new JButton("自定义按钮"); customButton.setIcon(new ImageIcon("path/to/custom/icon.png")); customButton.setOpaque(false); // 设置按钮透明 customButton.setContentAreaFilled(false); customButton.setBorderPainted(false); // 添加按钮到面板 add(customButton); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); // 绘制面板 Graphics2D g2d = (Graphics2D) g; g2d.drawImage(getImage(), 0, 0, null); } private BufferedImage getImage() { try { return ImageIO.read(new File("path/to/background/image.png")); } catch (IOException e) { e.printStackTrace(); return null; } } public static void main(String[] args) { JFrame frame = new JFrame("ButtonOnImageDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(500, 500); ButtonOnImageDemo panel = new ButtonOnImageDemo(); frame.add(panel); frame.setVisible(true); } } ``` 在该示例代码中,我们创建了一个自定义面板ButtonOnImageDemo,该面板包含一个带有自定义图案的按钮。在paintComponent()方法中,我们使用Graphics2D类的drawImage()方法将面板绘制到所需的图片上。在main()方法中,我们创建了一个JFrame并添加自定义面板,从而将带有自定义图案的按钮面板放在图片上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值