0 0

java Swing 中重写paintComponent造成的界面显示问题0

代码如下:
-------------------------------------------------------------------


import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.TimerTask;
import javax.swing.*;

public class RepaintCom {

    JFrame f = new JFrame();
    int step = 0;
    int isRun = 0;
    WorkListJPanel www;

    public RepaintCom() {

        BackgroundJPanel bg = new BackgroundJPanel();
        Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
        bg.setBounds(0, 0, scrSize.width, scrSize.height);
        f.setSize(scrSize.width, scrSize.height);

        f.getLayeredPane().setLayout(new BorderLayout());
        f.getLayeredPane().add(bg, BorderLayout.CENTER);


        f.setUndecorated(true);
 

        www = new WorkListJPanel();
        www.setVisible(false);
        f.getContentPane().add(www);
        com.sun.awt.AWTUtilities.setWindowOpacity(f, 0.3f);
        f.setVisible(true);

        timer();
    }

    public void toDisplay() {
        float opa = com.sun.awt.AWTUtilities.getWindowOpacity(f);
        opa = opa + 0.01f;
        if (opa <= 1) {
            com.sun.awt.AWTUtilities.setWindowOpacity(f, opa);
        }
    }

    public void toHidden() {

        float opa = com.sun.awt.AWTUtilities.getWindowOpacity(f);
        opa = opa - 0.11f;
        if (opa >= 0) {
            com.sun.awt.AWTUtilities.setWindowOpacity(f, opa);
        }
    }
    java.util.Timer t = null;

    private void timer() {

        //final //new java.util.Timer(true);
        Thread startT = new Thread(new Runnable() {

            public void run() {
                while (true) {
                    if (isRun == 1) {
                        continue;
                    }
                    //Show.println(" to runing");
                    if (step == 0) {
                        t = new java.util.Timer(true);
                        t.schedule(new TimerTask() {

                            public void run() {
                                // Show.println("to dispaly");
                                toDisplay();
                            }
                        }, 100, 20);
                        isRun = 1;
                        continue;
                    } else if (step == 1) {
                        t = new java.util.Timer(true);
                        t.schedule(new TimerTask() {

                            public void run() {
                                // Show.println("to hidden" + com.sun.awt.AWTUtilities.getWindowOpacity(f));
                                toHidden();
                            }
                        }, 100, 20);
                        isRun = 1;
                        continue;
                    } else if (step == 2) {
                        t = new java.util.Timer(true);
                        t.schedule(new TimerTask() {

                            public void run() {
                                java.awt.EventQueue.invokeLater(new Runnable() {

                                    public void run() {
                                        www.setVisible(true);
                                    }
                                });
                                toDisplay();
                            }
                        }, 100, 20);
                        isRun = 1;
                        continue;
                    } else if (step == 3) {
                        break;
                    }
                }
            }
        });
        startT.start();


        Thread lisentnerT = new Thread(new Runnable() {

            public void run() {
                while (true) {
                    if (step == 0) {
                        if ((com.sun.awt.AWTUtilities.getWindowOpacity(f) + 0.01f) > 1) {
                            t.cancel();
                            isRun = 0;
                            step = 1;
                            continue;
                        }
                    } else if (step == 1) {
                        if ((com.sun.awt.AWTUtilities.getWindowOpacity(f) - 0.01f) < 0) {
                            t.cancel();
                            isRun = 0;
                            step = 2;
                            continue;
                        }
                    } else if (step == 2) {
                        if ((com.sun.awt.AWTUtilities.getWindowOpacity(f) + 0.01f) > 1) {
                            t.cancel(); 
                            isRun = 0;
                            step = 3;
                            break;
                        }
                    }
                }
            }
        });

        lisentnerT.start();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        new RepaintCom();

    }
}

//程序其实页面背景,启动时第一个页面的背景
class BackgroundJPanel extends JPanel {

    public BackgroundJPanel() {
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        javax.swing.ImageIcon background = new javax.swing.ImageIcon("sour/start_t.png");
        Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
        g.drawImage(background.getImage(), 0, 0, scrSize.width, scrSize.height, background.getImageObserver());

    }
}

//获得想定的作业列表控件
class WorkListJPanel extends JPanel {

    JLabel jl;
    JPanel titlePanel;

    public WorkListJPanel() {
        ini();
    }

    private void ini() {


        jl = new JLabel() {

            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D) g;
                g2.setFont(new Font("黑体", Font.BOLD, 45));
                g2.setColor(Color.yellow);
                g2.drawString(" 当 前 所 有 作 业 :", 39, 69);
                g2.drawString(" 当 前 所 有 作 业 :", 41, 71);
                g2.setColor(new Color(Integer.parseInt("18533f", 16)));
                g2.drawString(" 当 前 所 有 作 业 :", 40, 70);

            }
        };
        jl.setPreferredSize(new Dimension(300, 100));
        jl.setHorizontalTextPosition(SwingConstants.LEFT);

        titlePanel = new JPanel() {

            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D) g;
                javax.swing.ImageIcon background = new javax.swing.ImageIcon("sour/title_bg.png");
                Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
                BufferedImage bf = new BufferedImage(45, 100, BufferedImage.TYPE_INT_ARGB);
                Graphics2D gggg = bf.createGraphics();
                gggg.drawImage(background.getImage(), 0, 0, scrSize.width, 140, background.getImageObserver());
                g2.drawImage(bf, 0, 0, scrSize.width, 140, background.getImageObserver());
            }
        };
        titlePanel.setLayout(new BorderLayout());
        titlePanel.add(jl, BorderLayout.CENTER);
        titlePanel.add(new CloseWinButton(), BorderLayout.LINE_END);
        titlePanel.setOpaque(false);

        // jl.setBorder(new LineBorder(Color.blue, 1, true));
        //titlePanel.setBorder(new LineBorder(Color.red, 1, true));


        this.setLayout(new BorderLayout());
        this.add(titlePanel, BorderLayout.PAGE_START);

    }
    javax.swing.ImageIcon background = new javax.swing.ImageIcon("micai.png");
    Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g.drawImage(background.getImage(), 0, 0, scrSize.width, scrSize.height, background.getImageObserver());
        // 细致渲染、绘制背景,可控制截取图片,显示于指定的JPanel位置
        //g2.drawImage(background.getImage(), 0, 0, scrSize.width, scrSize.height,0, 0, background.getIconWidth(), background.getIconHeight(), background.getImageObserver());
        int x = 0, y = 0;
        while (y < scrSize.height + background.getIconHeight()) {
            while (x < scrSize.width + background.getIconWidth()) {
                g2.drawImage(background.getImage(), x, y, background.getIconWidth(), background.getIconHeight(), background.getImageObserver());
                x = x + background.getIconWidth();
            }
            x = 0;
            y = y + background.getIconHeight();
        }
    }
    private long selectedId;
}

//关闭窗口的右上角按钮
class CloseWinButton extends JButton {

    public CloseWinButton() {

        this.setToolTipText("退出系统");
        this.setPreferredSize(new Dimension(45, 100));
        this.setContentAreaFilled(false); //不绘制内容区域
        this.setBorderPainted(false); //不绘制边框 
        this.setFocusPainted(false); //不绘制焦点状态
        this.addMouseListener(new java.awt.event.MouseAdapter() {

            public void mouseClicked(java.awt.event.MouseEvent evt) {
                System.exit(0);
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                image = "sour/closeO.png";
            }

            @Override
            public void mousePressed(MouseEvent e) {
                image = "sour/closeD.png";
            }

            @Override
            public void mouseExited(MouseEvent e) {
                image = "sour/closeI.png";
            }
        });
    }
    String image = "sour/closeI.png";

    @Override
    protected void paintComponent(Graphics g) {

        javax.swing.ImageIcon background = new javax.swing.ImageIcon(image);

        BufferedImage bf = new BufferedImage(45, 100, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = bf.createGraphics();
        g2.drawImage(background.getImage(), 0, 0, 45, 100, background.getImageObserver());
        g.drawImage(bf, 0, 0, 45, 100, background.getImageObserver());

        super.paintComponent(g);
    }

    @Override
    public Component add(Component comp) {
        return super.add(comp);
    }
}


附件中是用到的图片

//
//问题:
//        1为什么鼠标在关闭按钮上悬停一会,附近区域就会发生变化,鼠标移动一下就会把后面一层的背景显示出来。
//        2为什么后台有异常发生。java.lang.IllegalArgumentException: cannot add to layout: constraint must be a string (or null)

问题补充:这是一个程序启动动画效果的程序,通过渐变显示一个界面然后再切换到主程序界面
2014年7月20日 16:39

1个答案 按时间排序 按投票排序

0 0

楼主代码是有问题的吧   要把WorkListJPanel 中的paintComponent方法去掉 才能有结果。如图,没有测试出问题:

上悬停一会,附近区域就会发生变化,是不是你机器显卡不够,渲染的不好。呵呵

2014年7月21日 12:00

相关推荐

    Java swing画随机圆

    Java Swing 是Java图形用户界面(GUI)工具包的一部分,它允许开发者创建丰富的桌面应用程序。在“Java Swing画随机圆”这个题目中,学生被要求利用Java Swing库来创建一个程序,该程序能够在屏幕上动态地绘制出大小...

    java swing 多选下拉框 支持动态加载数据

    渲染器是决定组件如何显示元素的类,我们需要重写`paintComponent()`方法,以便在下拉框中显示已选中的多个选项。 3. **Custom Model**:JComboBox的模型(DefaultComboBoxModel)需要扩展以支持多选。这可能涉及到...

    迷宫问题 java swing

    在Java Swing中,我们可以使用`JPanel`或者`JComponent`作为画布,通过重写`paintComponent`方法来绘制迷宫。每个通道可以用不同颜色的线条表示,墙则用不同的颜色填充。 **迷宫自动寻路**: 迷宫的自动寻路同样...

    Java编程实现swing圆形按钮实例代码

    Java编程实现swing圆形按钮实例代码 Java编程实现swing圆形按钮实例代码主要介绍了Java编程实现swing圆形按钮实例代码,涉及两个简单的Java实现按钮的代码,其中一个具有侦测点击事件的简单功能,具有一定借鉴价值...

    java swing围棋游戏

    Java Swing是Java GUI(图形用户界面)库,用于构建桌面应用程序。在本案例中,"java swing围棋游戏"是一个基于Swing开发的围棋应用程序。它提供了用户友好的图形界面,让用户能够在线上或本地环境中玩围棋游戏。让...

    java swing绘制正弦曲线

    这个自定义的`Component`通常会继承`javax.swing.JComponent`或`java.awt.Component`,然后重写`paintComponent(Graphics g)`方法。`Graphics`对象是Java提供的绘图接口,它提供了各种绘图操作,如线条、形状和颜色...

    java swing飞机大战小游戏

    Java Swing 是Java编程环境中用于构建图形用户界面(GUI)的一个工具包,它是Java Foundation Classes (JFC) 的一部分。在本项目"java swing飞机大战小游戏"中,开发者使用了Swing来创建一个简单的飞机大战游戏,这...

    JAVA图形化界面SWING

    在Swing中,我们可以使用JPanel作为游戏的画布,通过重写paintComponent方法绘制游戏画面,并通过定时器控制游戏的帧率和逻辑更新。这个文件可能包含了游戏逻辑、蛇的移动规则、食物生成以及碰撞检测等功能。 `...

    JavaSwing之俄罗斯方块

    在Swing中,我们可以使用JPanel或者自定义的图形组件来绘制这些方块,通过重写paintComponent方法实现图形绘制。 事件处理是JavaSwing中的关键部分。为了响应用户的键盘输入,如方向键控制方块的移动,我们需要添加...

    java swing开发俄罗斯方块游戏

    在俄罗斯方块游戏中,每个方块都是一个简单的矩形,开发者需要在指定的JPanel上重写paintComponent方法进行绘制。 5. **游戏逻辑**:游戏的核心部分是逻辑处理,包括方块的生成、下落、碰撞检测、消除行、得分计算...

    java Swing 小游戏

    Java Swing小游戏是一个适合初学者练习和提升编程技能的项目,主要使用了Java的图形用户界面(GUI)库Swing来创建交互式的游戏程序。Swing是Java标准版(Java SE)的一部分,提供了丰富的组件和工具,可以构建出美观...

    java Swing 贪食蛇 源码

    Java Swing 是Java GUI(图形用户界面)开发的一个重要库,它是Java Foundation Classes (JFC)的一部分,用于构建桌面应用程序。贪食蛇游戏是一款经典的游戏,它简单易玩,且适合初学者学习编程逻辑。在Java Swing中...

    儿时回忆,贪吃蛇,Java swing编写,完美运行。myeclipes导入即可

    2. **自定义组件**:创建一个继承自JComponent的类,重写paintComponent方法,使用Graphics2D对象进行绘图。这包括绘制蛇的身体、食物以及其他可能的游戏元素。 3. **事件处理**:使用KeyListener或者...

    Java Swing实现仿Chrome浏览器跳跳龙小游戏.zip

    在游戏界面中,JPanel将被用作游戏画布,开发者可以重写其paintComponent方法进行自定义绘制,如绘制游戏背景、角色、障碍物等。 接着,游戏的核心逻辑会涉及到事件处理和定时器。事件处理是响应用户输入,例如键盘...

    用java Swing做的俄罗斯方块

    开发者会利用`paintComponent()`方法重写,以在JPanel上画出游戏中的方块和游戏界面。 4. **事件处理**: - Java Swing支持事件监听机制。开发者会为键盘事件(如方向键控制方块移动)和鼠标事件(可能的暂停或...

    java-swing编程(一个简单的图片查看器).

    Java Swing 是 Java 平台上的一个图形用户界面(GUI)工具包,提供了丰富的组件用于创建桌面应用程序。本文将深入解析如何利用 Java Swing 构建一个简单但功能完备的图片查看器。 #### 主要组件 这个图片查看器由...

    JAVASWING多线程产生随机球

    在“JAVASWING多线程产生随机球”的项目中,开发者利用Swing创建了一个互动的应用程序,用户可以通过鼠标点击在界面上生成一个球体,这个球体会以随机的方向和速度在窗口内移动。下面将详细解释这个项目涉及的知识点...

    java_swing完整版贪吃蛇

    开发者可能在JPanel的paintComponent方法中重写,进行定制化的图形绘制。 3. **事件监听**:Java Swing 提供了键盘监听机制,让玩家可以通过键盘控制蛇的移动。开发者可能注册了KeyListener或使用Key Bindings来...

    Java Swing实现一个计算器.docx

    Java Swing是Java语言中的一种图形用户界面(GUI)组件库,提供了大量的GUI组件,例如按钮、标签、文本框、列表框等,用于构建桌面应用程序。Java Swing是Java标准库的一部分,提供了一个跨平台的解决方案来构建GUI...

    基于Java Swing的推箱子游戏

    这是一个基于Java Swing的推箱子游戏。游戏界面由一个名为PushBoxGame的类实现,其中包含了游戏的迷宫布局信息以及方块的移动逻辑。游戏通过四个按钮实现方块的移动,玩家需要通过移动方块,将箱子推到指定的位置。...

Global site tag (gtag.js) - Google Analytics