标签: paintcomponent

Swing - 未调用paintComponent方法

我只是实现了继承JPanel的类,如下所示

public class Orpanel extends JPanel {

....
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(tpaint);
        g2d.fill(rect); 
    }
....
}
Run Code Online (Sandbox Code Playgroud)

Orpanel正在加载图像并调整它自己的大小.

这是问题.

调用JFrame的setContentpane(Orpanel的实例)使它工作正常但是当我将Orpanel附加到JFrame时调用add()方法而不是setContentpane(我知道setcontentpane并不意味着附加..无论如何),它不起作用.

最后想通了当我使用add()方法时,添加到JFrame的Component不会调用paintComponent()方法.即使我手动调用repaint()方法,仍然不会调用paintComponent()方法.

我错过了什么?任何帮助将不胜感激!

thx提前.Jaeyong shin.


我添加了额外的代码.

public Test(OwPanel op) 
{
    super();
    Dimension monitor = Toolkit.getDefaultToolkit().getScreenSize();
    op.setBackground(Color.white);
    this.setBackground(Color.white);        
    this.setBounds(monitor.width / 2 - 200 , monitor.height / 2 - 200, 400, 400);       
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setTitle("test");      
    this.setLayout(null);
    this.getContentPane().add(op);
    //this.setContentPane(op);
    this.setVisible(true);
    this.validate();
}

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public …
Run Code Online (Sandbox Code Playgroud)

java swing paintcomponent

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

Java Swing循环进度条不起作用

我从Oracle站点发现了这个测试项目,因为我想在我的项目中添加一个循环进度条.

我正在使用Netbeans开发应用程序,当我启动应用程序时,应该是圆圈的JPanel ....令人失望.

我删除了所有无法解决此问题的代码,我已经得到了这段代码:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import javax.swing.*;
import javax.swing.plaf.LayerUI;


public class Loading_Test extends javax.swing.JFrame
{
    static final WaitLayerUI layerUI = new WaitLayerUI();
    public Loading_Test()
    {

        JPanel panel = new JPanel();
        JLayer<JPanel> jlayer = new JLayer<>(panel, layerUI);
        add(jlayer);

        initComponents();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }

    public static void main(String args[])
    { …
Run Code Online (Sandbox Code Playgroud)

java swing jlayer paintcomponent java-7

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

消息框不会停止出现

老实说,我不确定标题是否完全适合这个问题,但无论如何它都在这里.我在java中制作了一个简单的游戏,其中外星人的宇宙飞船从屏幕顶部掉下来,如果你不杀死它们并且它们到达屏幕的底部,那么空间站会受到伤害.但是每当空间站被摧毁时,应该告诉玩家他们已经死亡的消息框不会停止出现,它会一直反复出现.在控制台中,我收到一条不会停止变大的错误消息!这是我对空间站健康的代码:

public class SpaceStation extends Entity {
public static int stationHealth = 100;

public SpaceStation(int x, int y) {
    super(x, y);
}

public void update() {
}

public void draw(Graphics2D g2d) {
    g2d.drawImage(ImageLocator.getSpaceStation(), 0, 595, null);

    // HEALTH BAR
    g2d.fillRect(5, 25, stationHealth, 10);

    if(stationHealth <= 0) {
        try{
            JOptionPane.showMessageDialog(null, "You died on level "
                    + GameFrame.level + ". Better luck next time!");
            GameFrame.mainTimer.stop();
            System.exit(0);
        }
        catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage());
            System.exit(0);
        } 
    }
}

public Rectangle getBounds() {
    return new Rectangle(x, …
Run Code Online (Sandbox Code Playgroud)

java swing graphics2d paintcomponent

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

带键键的线程

我是Java图形和线程的新手,我正在尝试制作游戏(特别是Pong).这个想法是两个人可以在同一个键盘上玩(即有两个通过不同键控制的拨片).目前,两名球员不能同时移动他们的球拍.

这个问题有方法解决吗?单独的线程是答案吗?

如果可能的话,我希望桨能够同时移动(至少看似).

更新:似乎使用Set<Integer>存储按键是最好的选择.我已经完成了(并且它可以工作),但我想知道是否有任何此代码不在事件调度线程(EDT)上,如果我需要使用SwingUtilities.invokeLater();.这是必要的代码:

private Set<Integer> keysDown = Collections.synchronizedSet(new HashSet<Integer>());

public void keyPressed(KeyEvent e) 
{
    keysDown.add(e.getKeyCode());
}

public void keyReleased(KeyEvent e) 
{    
    keysDown.remove(e.getKeyCode());
}

public void updatePaddlePositions()
{
    if (keysDown.contains(KeyEvent.VK_W)) 
        paddleOne.move(-PADDLE_MOVE_INCREMENT);

    if (keysDown.contains(KeyEvent.VK_S))
        paddleOne.move(PADDLE_MOVE_INCREMENT);

    if (keysDown.contains(KeyEvent.VK_UP))
        paddleTwo.move(-PADDLE_MOVE_INCREMENT);

    if (keysDown.contains(KeyEvent.VK_DOWN))
        paddleTwo.move(PADDLE_MOVE_INCREMENT);

    try {
        Thread.sleep(DELAY);
    } catch (InterruptedException e) {
        System.out.println("You Interrupted the game!");
    }

    canvas.repaint();
}
Run Code Online (Sandbox Code Playgroud)

这是对象的paintComponent方法canvas:

public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    paddleOne.paint(g);
    paddleTwo.paint(g);
    updatePaddlePositions(); // Does this need to be …
Run Code Online (Sandbox Code Playgroud)

java swing multithreading key-bindings paintcomponent

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

JLabel:重写paintComponent()之后.如何使setText()呈现文本字符串?

我写了一个JLabel的子类,我重写paintComponent(Graphics)方法来制作渐变背景颜色.

这是JLabel的子类:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.BorderFactory;
import javax.swing.JLabel;

public class DLabel extends JLabel
{

    Dimension size = new Dimension(70, 80);

    public DLabel()
    {
        this.setPreferredSize(size);
        this.setBorder(BorderFactory.createBevelBorder(TOP, Color.white, Color.black));
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        Color color1 = new Color(226, 218, 145);
        Color color2 = color1.brighter();
        int w = getWidth();
        int h = getHeight();
        GradientPaint gp = new GradientPaint(
                0, 0, color1, 0, h, color2);
        g2d.setPaint(gp); …
Run Code Online (Sandbox Code Playgroud)

java swing overriding jlabel paintcomponent

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

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

我得到以下代码:

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

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

用Java创建一个简单的自定义JComponent?

我想开始为工作中的项目构建自己的自定义JComponent.我在下面有一个简单的例子,它应该只是在屏幕上创建一个球.(我在互联网上发现了大部分内容),但确实提供了一个不错的起点.我的问题是为什么这段代码不能以我的形式显示球?我做错了什么?

那么应该为自定义JComponent提供的所有基本方法是什么?

码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class testBall {
    public static void main(String[] args) {
        new testBall();
    }

    public testBall() {
        JPanel testPane = new JPanel();
        testPane.setBackground(Color.white);
        testPane.setLayout(new GridBagLayout());
        testPane.add(new MyBall(30,30,10));

        JFrame frame = new JFrame("Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(testPane);
        frame.pack();
        frame.setSize(500, 300); 
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

class MyBall extends JComponent
{
    private static final long serialVersionUID = 1L;
    public MyBall() { }
    public MyBall(int x, int y, …
Run Code Online (Sandbox Code Playgroud)

java swing jcomponent paintcomponent preferredsize

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

从直线嵌套抛物线曲线

我无法为我的作业复制图片.我将不胜感激任何提示或解决方案.我相信我有一般的想法,但我很难找出数学来复制图像并在一个循环中完成所有事情.

我的程序需要满足以下条件:

  1. 匹配图像
  2. 为每对抛物线生成随机颜色
  3. 适用于任何宽度或高度
  4. 使用单个循环绘制整个图形.

这是图像: 图片 这是我到目前为止所尝试的

public static final int WIDTH = 500;
public static final int HEIGHT = 500;
public static final int LINE_INCREMENT = 5;

public static void main(String[] args) {

    DrawingPanel panel = new DrawingPanel(WIDTH, HEIGHT);
    Graphics g = panel.getGraphics();
    int d = 0;

    int iterations = HEIGHT/LINE_INCREMENT;
    Random rand = new Random();
    int red = 0, green = 0, blue = 0;
    red = rand.nextInt(128) + 128;
    green = rand.nextInt(128) + 128;
    blue = …
Run Code Online (Sandbox Code Playgroud)

java swing curve paint paintcomponent

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

我应该将游戏循环放在 Swing 应用程序的什么位置?

我正在尝试用 Java 制作一个简单的 2D 游戏。
据我所知,我的游戏应该由两个线程组成:“事件调度线程”(用于 GUI 操作)和“游戏线程”(用于游戏循环)。
我创建了一个大纲,但找不到放置游戏循环的位置。
简而言之,我正在尝试在不冻结 UI 线程的情况下创建游戏循环。
如果您能提供有关我做错的事情的任何信息,我将不胜感激。
这是我的游戏循环(您也可以提供提示以创建更好的游戏循环):

while(true) {
    repaint();
    try {
        Thread.sleep(17);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

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

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();

            }

        });
    }
    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Forge …
Run Code Online (Sandbox Code Playgroud)

java swing timer game-loop paintcomponent

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